From f9a23ca0b40bd0701ba824c1617fdde62eca28df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 7 May 2021 23:14:20 +0200 Subject: [PATCH 001/206] Simpler mathbin correction --- luamml-convert.lua | 72 ++++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index 3518422..d4947b2 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -307,21 +307,53 @@ local function rule_to_table(rule, sub, cur_style) return {[0] = 'mspace', mathbackground = 'currentColor', width = width, height = height, depth = depth}, space_like end +-- The only part which changes the nodelist, we are converting bin into ord +-- nodes in the same way TeX would do it later anyway. +local function cleanup_mathbin(head) + local last = 'open' -- last sub if id was noad_t, left fence acts fakes being a open noad, bin are themselves. Every other noad is ord + for n, id, sub in node.traverse(head) do + if id == noad_t then + sub = noad_sub[sub] + if sub == 'bin' then + if node.is_node(last) or last == 'opdisplaylimits' + or last == 'oplimits' or last == 'opnolimits' or last == 'rel' + or last == 'open' or last == 'punct' then + n.subtype, last = noad_sub.ord, 'ord' + else + last = n + end + else + if (sub == 'rel' or sub == 'close' or sub == 'punct') + and node.is_node(last) then + last.subtype = 'ord' + end + last = sub + end + elseif id == fence_t then + if sub == fence_sub.left then + last = 'open' + else + if node.is_node(last) then + last.subtype = noad_sub.ord, 'ord' + end + last = 'ord' + end + elseif id == fraction_t or id == radical_t or id == accent_t then + last = 'ord' + end + end + if node.is_node(last) then + last.subtype = noad_sub.ord + end +end + function nodes_to_table(head, cur_style) + cleanup_mathbin(head) local t = {[0] = 'mrow'} local result = t local nonscript local core, mn = space_like - local no_binop_context, last_noad, last_noad_core = true for n, id, sub in node.traverse(head) do - if last_noad and ((id == noad_t and noad_sub[sub] == 'punct') or (id == fence_t and fence_sub[sub] ~= 'left')) then - last_noad['tex:class'], last_noad_core[0] = nil, 'mi' - last_noad_core.stretchy, last_noad_core.mathvariant = nil, #last_noad_core == 1 - and type(last_noad_core[0]) == 'string' - and utf8.len(last_noad_core[0]) == 1 - and utf8.codepoint(last_noad_core[0]) < -0x10000 - and 'normal' or nil - end local new_core, new_mn local props = properties[n] props = props and props.mathml_table @@ -329,19 +361,6 @@ function nodes_to_table(head, cur_style) t[#t+1], new_core = props, user_provided elseif id == noad_t then local substr = noad_sub[sub] - if substr == 'bin' then - if no_binop_context then - sub, substr = 0, 'ord' - end - end - no_binop_context = false - or substr == 'bin' - or substr == 'opdisplaylimits' - or substr == 'oplimits' - or substr == 'opnolimits' - or substr == 'rel' - or substr == 'open' - or substr == 'punct' local new_n new_n, new_core, new_mn = noad_to_table(n, sub, cur_style, mn) if new_mn == false then @@ -349,14 +368,8 @@ function nodes_to_table(head, cur_style) else t[#t+1] = new_n -- might be nil end - if substr == 'bin' then - last_noad, last_noad_core = new_n, new_core - else - last_noad, last_noad_core = nil, nil - end elseif id == accent_t then t[#t+1], new_core = accent_to_table(n, sub, cur_style) - no_binop_context, last_noad, last_noad_core = false, nil, nil elseif id == style_t then if sub ~= cur_style then if #t == 0 then @@ -383,13 +396,10 @@ function nodes_to_table(head, cur_style) or assert(false)], 2*size), space_like elseif id == radical_t then t[#t+1], new_core = radical_to_table(n, sub, cur_style) - no_binop_context, last_noad, last_noad_core = false, nil, nil elseif id == fraction_t then t[#t+1], new_core = fraction_to_table(n, sub, cur_style) - no_binop_context, last_noad, last_noad_core = false, nil, nil elseif id == fence_t then t[#t+1], new_core = fence_to_table(n, sub, cur_style) - no_binop_context, last_noad, last_noad_core = false, nil, nil elseif id == kern_t then if not nonscript then t[#t+1], new_core = space_to_table(n.kern, sub, cur_style) From 562f9b1248a23d317f1841fdc99ba2fcb0a85f8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 11 May 2021 06:16:36 +0200 Subject: [PATCH 002/206] Don't use strings for nod subtyps --- luamml-convert.lua | 73 +++++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index d4947b2..e653540 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -11,7 +11,30 @@ local radical_t, fraction_t, fence_t = node.id'radical', node.id'fraction', node local math_char_t, sub_box_t, sub_mlist_t = node.id'math_char', node.id'sub_box', node.id'sub_mlist' -local noad_sub = node.subtypes'noad' +local function invert_table(t) + local t_inv = {} + for k, v in next, t do + t_inv[v] = k + end + return t_inv +end + +local noad_names = node.subtypes'noad' +local noad_sub = invert_table(noad_names) +local noad_ord = noad_sub.ord +local noad_op = noad_sub.opdisplaylimits +local noad_oplimits = noad_sub.oplimits +local noad_opnolimits = noad_sub.opnolimits +local noad_bin = noad_sub.bin +local noad_rel = noad_sub.rel +local noad_open = noad_sub.open +local noad_close = noad_sub.close +local noad_punct = noad_sub.punct +local noad_inner = noad_sub.inner +local noad_under = noad_sub.under +local noad_over = noad_sub.over +local noad_vcenter = noad_sub.vcenter + local radical_sub = node.subtypes'radical' local fence_sub = node.subtypes'fence' @@ -125,7 +148,7 @@ local function maybe_to_mn(noad, core) local after = noad.next if not after then return end if after.id ~= noad_t then return end - if noad_sub[after.subtype] ~= 'ord' then return end + if after.subtype ~= noad_ord then return end after = after.nucleus if not after then return end if after.id ~= math_char_t then return end @@ -134,9 +157,8 @@ local function maybe_to_mn(noad, core) end local function noad_to_table(noad, sub, cur_style, mn) - local class = noad_sub[sub] - local nucleus, core = kernel_to_table(noad.nucleus, class == 'over' and cur_style//2*2+1 or cur_style) - if class == 'ord' then + local nucleus, core = kernel_to_table(noad.nucleus, sub == noad_over and cur_style//2*2+1 or cur_style) + if sub == noad_ord then if core and core[0] == 'mo' then core[0] = 'mi' core.stretchy, core.mathvariant = nil, #core == 1 and type(core[0]) == 'string' and utf8.len(core[0]) == 1 and utf8.codepoint(core[0]) < -0x10000 and 'normal' or nil @@ -157,8 +179,8 @@ local function noad_to_table(noad, sub, cur_style, mn) end end end - elseif class == 'opdisplaylimits' or class == 'oplimits' or class == 'opnolimits' or class == 'bin' or class == 'rel' or class == 'open' - or class == 'close' or class == 'punct' or class == 'inner' then + elseif sub == noad_op or sub == noad_oplimits or sub == noad_opnolimits or sub == noad_bin or sub == noad_rel or sub == noad_open + or sub == noad_close or sub == noad_punct or sub == noad_inner then if not core or not core[0] then -- TODO else @@ -166,10 +188,10 @@ local function noad_to_table(noad, sub, cur_style, mn) if stretchy[core[1]] then core.stretchy = false end if core.mathvariant == 'normal' then core.mathvariant = nil end end - nucleus['tex:class'] = class + nucleus['tex:class'] = noad_names[sub] - if (noad.sup or noad.sub) and (class == 'opdisplaylimits' or class == 'oplimits') then - nucleus.movablelimits = class == 'opdisplaylimits' + if (noad.sup or noad.sub) and (sub == noad_op or sub == noad_oplimits) then + nucleus.movablelimits = sub == noad_op local sub = kernel_to_table(noad.sub, sub_style(cur_style)) local sup = kernel_to_table(noad.sup, sup_style(cur_style)) return {[0] = sup and (sub and 'munderover' or 'mover') or 'munder', @@ -178,17 +200,17 @@ local function noad_to_table(noad, sub, cur_style, mn) sub and sup, }, core end - elseif class == 'under' then + elseif sub == noad_under then return {[0] = 'munder', nucleus, {[0] = 'mo', '_',}, }, core - elseif class == 'over' then + elseif sub == noad_over then return {[0] = 'mover', nucleus, {[0] = 'mo', '\u{203E}',}, }, core - elseif class == 'vcenter' then -- Ignored. Nucleus will need special handling anyway + elseif sub == noad_vcenter then -- Ignored. Nucleus will need special handling anyway else error[[confusion]] end @@ -313,37 +335,36 @@ local function cleanup_mathbin(head) local last = 'open' -- last sub if id was noad_t, left fence acts fakes being a open noad, bin are themselves. Every other noad is ord for n, id, sub in node.traverse(head) do if id == noad_t then - sub = noad_sub[sub] - if sub == 'bin' then - if node.is_node(last) or last == 'opdisplaylimits' - or last == 'oplimits' or last == 'opnolimits' or last == 'rel' - or last == 'open' or last == 'punct' then - n.subtype, last = noad_sub.ord, 'ord' + if sub == noad_bin then + if node.is_node(last) or last == noad_opdisplaylimits + or last == noad_oplimits or last == noad_opnolimits + or last == noad_rel or last == noad_open or last == noad_punct then + n.subtype, last = noad_ord, noad_ord else last = n end else - if (sub == 'rel' or sub == 'close' or sub == 'punct') + if (sub == noad_rel or sub == noad_close or sub == noad_punct) and node.is_node(last) then - last.subtype = 'ord' + last.subtype = noad_ord end last = sub end elseif id == fence_t then if sub == fence_sub.left then - last = 'open' + last = noad_open else if node.is_node(last) then - last.subtype = noad_sub.ord, 'ord' + last.subtype = noad_ord, noad_ord end - last = 'ord' + last = noad_ord end elseif id == fraction_t or id == radical_t or id == accent_t then - last = 'ord' + last = noad_ord end end if node.is_node(last) then - last.subtype = noad_sub.ord + last.subtype = noad_ord end end From ba219a05bb6f19a1003419b89d07e6af5fd6961d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 11 May 2021 06:18:51 +0200 Subject: [PATCH 003/206] Suppress automatic spacing --- luamml-convert.lua | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index e653540..bb1fb16 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -73,12 +73,13 @@ local function delim_to_table(delim) else local fam = delim.small_fam char = remap_lookup[fam << 21 | char] - local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = not stretchy[char] or nil } + local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = not stretchy[char] or nil, lspace = 0, rspace = 0 } return result, result end end --- Like kernel_to_table but always a math_char_t. Also creating a mo and potentially remapping to handle combining chars +-- Like kernel_to_table but always a math_char_t. Also creating a mo and potentially remapping to handle combining chars. +-- No lspace or space is set here since these never appear as core operators in an mrow. local function acc_to_table(acc, cur_style, stretch) if not acc then return end local props = properties[acc] props = props and props.mathml_table @@ -161,8 +162,8 @@ local function noad_to_table(noad, sub, cur_style, mn) if sub == noad_ord then if core and core[0] == 'mo' then core[0] = 'mi' - core.stretchy, core.mathvariant = nil, #core == 1 and type(core[0]) == 'string' and utf8.len(core[0]) == 1 and utf8.codepoint(core[0]) < -0x10000 and 'normal' or nil - core['tex:class'] = nil + core.mathvariant = #core == 1 and type(core[0]) == 'string' and utf8.len(core[0]) == 1 and utf8.codepoint(core[0]) < -0x10000 and 'normal' or nil + core['tex:class'], core.stretchy, core.lspace, core.rspace = nil end if nucleus == core and #core == 1 then if mn and core[0] == 'mi' and (core[1] == '.' or core[1] == ',') and maybe_to_mn(noad, core) or core[0] == 'mn' then @@ -187,6 +188,7 @@ local function noad_to_table(noad, sub, cur_style, mn) core[0] = 'mo' if stretchy[core[1]] then core.stretchy = false end if core.mathvariant == 'normal' then core.mathvariant = nil end + core.lspace, core.rspace = 0, 0 end nucleus['tex:class'] = noad_names[sub] From 98fd0a477a0a52eb1f8972812c992b9f4e774b90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 13 May 2021 02:56:37 +0200 Subject: [PATCH 004/206] Enforce TeX like spacing --- luamml-convert.lua | 109 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 94 insertions(+), 15 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index bb1fb16..2d6600b 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -20,6 +20,8 @@ local function invert_table(t) end local noad_names = node.subtypes'noad' + +--[[ We could determine the noad subtypes dynamically: local noad_sub = invert_table(noad_names) local noad_ord = noad_sub.ord local noad_op = noad_sub.opdisplaylimits @@ -34,6 +36,60 @@ local noad_inner = noad_sub.inner local noad_under = noad_sub.under local noad_over = noad_sub.over local noad_vcenter = noad_sub.vcenter +-- But the spacing table depends on their specific values anyway, so we just verify the values +]] +local noad_ord, noad_op, noad_oplimits, noad_opnolimits = 0, 1, 2, 3 +local noad_bin, noad_rel, noad_open, noad_close, noad_punct = 4, 5, 6, 7, 8 +local noad_inner, noad_under, noad_over, noad_vcenter = 9, 10, 11, 12 + +for i, n in ipairs{'ord', 'opdisplaylimits', 'oplimits', 'opnolimits', 'bin', + 'rel', 'open', 'close', 'punct', 'inner', 'under', 'over', 'vcenter'} do + assert(noad_names[i-1] == n) +end +-- Attention, the spacing_table is indexed by subtype+1 since 1-based tables are faster in Lua +local spacing_table = { + {0 , '0.167em', '0.167em', '0.167em', '0.222em', '0.278em', 0 , 0 , 0 , '0.167em', 0 , 0 , 0 , }, + {'0.167em', '0.167em', '0.167em', '0.167em', nil , '0.278em', 0 , 0 , 0 , '0.167em', '0.167em', '0.167em', '0.167em', }, + nil, + nil, + {'0.222em', '0.222em', '0.222em', '0.222em', nil , nil , '0.222em', nil , nil , '0.222em', '0.222em', '0.222em', '0.222em', }, + {'0.278em', '0.278em', '0.278em', '0.278em', nil , 0 , '0.278em', 0 , 0 , '0.278em', '0.278em', '0.278em', '0.278em', }, + {0 , 0 , 0 , 0 , nil , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , }, + {0 , '0.167em', '0.167em', '0.167em', '0.222em', '0.278em', 0 , 0 , 0 , '0.167em', 0 , 0 , 0 , }, + {'0.167em', '0.167em', '0.167em', '0.167em', nil , '0.167em', '0.167em', '0.167em', '0.167em', '0.167em', '0.167em', '0.167em', '0.167em', }, + {'0.167em', '0.167em', '0.167em', '0.167em', '0.222em', '0.278em', '0.167em', 0 , '0.167em', '0.167em', '0.167em', '0.167em', '0.167em', }, + nil, + nil, + nil, +} +local spacing_table_script = { + {0 , '0.167em', '0.167em', '0.167em', 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , }, + {'0.167em', '0.167em', '0.167em', '0.167em', nil , 0 , 0 , 0 , 0 , 0 , '0.167em', '0.167em', '0.167em', }, + nil, + nil, + {0 , 0 , 0 , 0 , nil , nil , 0 , nil , nil , 0 , 0 , 0 , 0 , }, + {0 , 0 , 0 , 0 , nil , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , }, + {0 , 0 , 0 , 0 , nil , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , }, + {0 , '0.167em', '0.167em', '0.167em', 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , }, + {0 , 0 , 0 , 0 , nil , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , }, + {0 , '0.167em', '0.167em', '0.167em', 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , }, + nil, + nil, + nil, +} +do -- Fill the blanks + local st, sts = spacing_table, spacing_table_script + + local st_op, sts_op = st[noad_op+1], sts[noad_op+1] + st[noad_oplimits+1], sts[noad_oplimits+1] = st_op, sts_op + st[noad_opnolimits+1], sts[noad_opnolimits+1] = st_op, sts_op + + local st_ord, sts_ord = st[noad_ord+1], sts[noad_ord+1] + st[noad_under+1], sts[noad_under+1] = st_ord, sts_ord + st[noad_over+1], sts[noad_over+1] = st_ord, sts_ord + st[noad_vcenter+1], sts[noad_vcenter+1] = st_ord, sts_ord +end + local radical_sub = node.subtypes'radical' local fence_sub = node.subtypes'fence' @@ -268,8 +324,8 @@ local function radical_to_table(radical, sub, cur_style) end local function fraction_to_table(fraction, sub, cur_style) - local num, core = kernel_to_table(fraction.num, sup_style(cur_style)) - local denom = kernel_to_table(fraction.denom, sub_style(cur_style)) + local num, core = kernel_to_table(fraction.num, cur_style + 2 - cur_style//6*2) + local denom = kernel_to_table(fraction.denom, cur_style//2*2 + 3 - cur_style//6*2) local left = delim_to_table(fraction.left) local right = delim_to_table(fraction.right) local mfrac = {[0] = 'mfrac', @@ -375,24 +431,25 @@ function nodes_to_table(head, cur_style) local t = {[0] = 'mrow'} local result = t local nonscript - local core, mn = space_like + local core, last_noad, last_core, mn = space_like, nil, nil, nil for n, id, sub in node.traverse(head) do - local new_core, new_mn + local new_core, new_mn, new_node, new_noad local props = properties[n] props = props and props.mathml_table if props then - t[#t+1], new_core = props, user_provided + new_node, new_core = props, user_provided elseif id == noad_t then - local substr = noad_sub[sub] local new_n new_n, new_core, new_mn = noad_to_table(n, sub, cur_style, mn) if new_mn == false then t[#t], new_mn = new_n, nil else - t[#t+1] = new_n -- might be nil + new_node = new_n -- might be nil end + new_noad = sub elseif id == accent_t then - t[#t+1], new_core = accent_to_table(n, sub, cur_style) + new_node, new_core = accent_to_table(n, sub, cur_style) + new_noad = noad_ord elseif id == style_t then if sub ~= cur_style then if #t == 0 then @@ -412,37 +469,59 @@ function nodes_to_table(head, cur_style) new_core = space_like elseif id == choice_t then local size = cur_style//2 - t[#t+1], new_core = nodes_to_table(n[size == 0 and 'display' + new_node, new_core = nodes_to_table(n[size == 0 and 'display' or size == 1 and 'text' or size == 2 and 'script' or size == 3 and 'scriptscript' or assert(false)], 2*size), space_like elseif id == radical_t then - t[#t+1], new_core = radical_to_table(n, sub, cur_style) + new_node, new_core = radical_to_table(n, sub, cur_style) + new_noad = noad_ord elseif id == fraction_t then - t[#t+1], new_core = fraction_to_table(n, sub, cur_style) + new_node, new_core = fraction_to_table(n, sub, cur_style) + new_noad = noad_inner elseif id == fence_t then - t[#t+1], new_core = fence_to_table(n, sub, cur_style) + new_node, new_core = fence_to_table(n, sub, cur_style) + local class = n.class + new_noad = class >= 0 and class or sub == fence_sub.left and noad_open or noad_close elseif id == kern_t then if not nonscript then - t[#t+1], new_core = space_to_table(n.kern, sub, cur_style) + new_node, new_core = space_to_table(n.kern, sub, cur_style) end elseif id == glue_t then if cur_style >= 4 or not nonscript then if sub == 98 then -- TODO magic number nonscript = true else - t[#t+1], new_core = space_to_table(n.width, sub, cur_style) + new_node, new_core = space_to_table(n.width, sub, cur_style) end end elseif id == rule_t then - t[#t+1], new_core = rule_to_table(n, sub, cur_style) + new_node, new_core = rule_to_table(n, sub, cur_style) -- elseif id == disc_t then -- Uncommon, does not play nicely with math mode and no sensible mapping anyway end -- The other possible ids are whatsit, penalty, adjust, ins, mark. Ignore them. nonscript = nil if core and new_core ~= space_like then core = core == space_like and new_core or nil end + if new_node then + if new_noad then + local space = last_noad and (cur_style >= 4 and spacing_table_script or spacing_table)[last_noad + 1][new_noad + 1] or 0 + if assert(space) ~= 0 then + if new_core and new_core[0] == 'mo' then + new_core.lspace = space + elseif last_core and last_core[0] == 'mo' then + last_core.rspace = space + else + t[#t+1] = {[0] = 'mspace', width = space} -- TODO Move into operators whenever possible + end + end + last_noad, last_core = new_noad, new_core + elseif new_node[0] ~= 'mspace' or new_node.mathbackground then + last_core = nil + end + t[#t+1] = new_node + end mn = new_mn end -- In TeX, groups are never space like From c4c2b701b5524c9c1326c4512cd7aee24f41d635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 12 May 2021 07:43:57 +0200 Subject: [PATCH 005/206] First attempt at generating structure elements --- luamml-convert.lua | 12 +++--- luamml-structelemwriter.lua | 83 +++++++++++++++++++++++++++++++++++++ luamml-tex.lua | 4 ++ luamml-xmlwriter.lua | 2 +- luamml.sty | 3 ++ test_tex.tex | 1 + 6 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 luamml-structelemwriter.lua diff --git a/luamml-convert.lua b/luamml-convert.lua index 2d6600b..0676ad7 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -129,7 +129,7 @@ local function delim_to_table(delim) else local fam = delim.small_fam char = remap_lookup[fam << 21 | char] - local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = not stretchy[char] or nil, lspace = 0, rspace = 0 } + local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = not stretchy[char] or nil, lspace = 0, rspace = 0, [':node'] = delim } return result, result end end @@ -149,7 +149,7 @@ local function acc_to_table(acc, cur_style, stretch) if stretch ~= not stretchy[char] then -- Handle nil gracefully in stretchy stretch = nil end - return {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = stretch} + return {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = stretch, [':node'] = acc} end local function kernel_to_table(kernel, cur_style) @@ -164,7 +164,8 @@ local function kernel_to_table(kernel, cur_style) local result = {[0] = elem, char, ['tex:family'] = fam ~= 0 and fam or nil, - mathvariant = utf8.len(char) == 1 and elem == 'mi' and utf8.codepoint(char) < 0x10000 and 'normal' or nil + mathvariant = utf8.len(char) == 1 and elem == 'mi' and utf8.codepoint(char) < 0x10000 and 'normal' or nil, + [':node'] = kernel, } return result, result elseif id == sub_box_t then @@ -172,7 +173,7 @@ local function kernel_to_table(kernel, cur_style) local result = to_text(kernel.list.head) return result, result else - local result = {[0] = 'mi', {[0] = 'mglyph', ['tex:box'] = kernel.list}} + local result = {[0] = 'mi', {[0] = 'mglyph', ['tex:box'] = kernel.list, [':node'] = kernel}} return result, result end elseif id == sub_mlist_t then @@ -305,7 +306,7 @@ local function radical_to_table(radical, sub, cur_style) local elem if kind == 'radical' or kind == 'uradical' then -- FIXME: Check that this is really a square root - elem, core = {[0] = 'msqrt', nucleus}, nil + elem, core = {[0] = 'msqrt', nucleus, [':node'] = left[':node'], }, nil elseif kind == 'uroot' then -- FIXME: Check that this is really a root elem, core = {[0] = 'msqrt', nucleus, kernel_to_table(radical.degree)}, nil @@ -331,6 +332,7 @@ local function fraction_to_table(fraction, sub, cur_style) local mfrac = {[0] = 'mfrac', linethickness = fraction.width and fraction.width == 0 and 0 or nil, bevelled = fraction.middle and "true" or nil, + [':node'] = fraction, num, denom, } diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua new file mode 100644 index 0000000..31afb0c --- /dev/null +++ b/luamml-structelemwriter.lua @@ -0,0 +1,83 @@ +local struct_begin = token.create'tag_struct_begin:n' +local struct_end = token.create'tag_struct_end:' + +local mc_begin = token.create'tag_mc_begin:n' +local mc_end = token.create'tag_mc_end:' + +local function escape_name(name) + return name +end + +local function escape_string(str) + return str +end + +local mathml_ns_obj +local function get_mathml_ns_obj() + mathml_ns_obj = mathml_ns_obj or token.create'c__pdf_backend_object_tag/NS/mathml_int'.index + return mathml_ns_obj +end + +local attribute_counter = 0 +local attributes = setmetatable({}, {__index = function(t, k) + attribute_counter = attribute_counter + 1 + local attr_name = string.format('luamml_attr_%i', attribute_counter) + t[k] = attr_name + tex.runtoks(function() + -- tex.sprint(string.format('\\tagpdfsetup{newattribute={%s}{/O/NSO/NS %i 0 R', + -- attr_name, mathml_ns_obj or get_mathml_ns_obj())) + tex.sprint(string.format('\\tagpdfsetup{newattribute={%s}{/O/MathML-3', + attr_name)) + tex.cprint(12, k) + tex.sprint'}}' + end) + return attr_name +end}) + +local mc_type = token.create'l__tag_mc_type_attr'.index +local mc_cnt = token.create'l__tag_mc_cnt_attr'.index +-- print('!!!', mc_type, mc_cnt) + +local attrs = {} +local function write_elem(tree, indent) + if not tree[0] then print('ERR', require'inspect'(tree)) end + local i = 0 + for attr, val in next, tree do if type(attr) == 'string' and not string.find(attr, ':') and attr ~= 'xmlns' then + -- for attr, val in next, tree do if type(attr) == 'string' and string.byte(attr) ~= 0x3A then + i = i + 1 + attrs[i] = string.format('/%s(%s)', escape_name(attr), escape_string(val)) + end end + table.sort(attrs) + local attr_name + if i == 0 then + tex.sprint{struct_begin, string.format('{tag=%s/mathml}', tree[0])} + else + tex.sprint{struct_begin, string.format('{tag=%s/mathml,attribute=%s}', tree[0], attributes[table.concat(attrs)])} + end + for j = 1, i do attrs[j] = nil end + + if tree[':node'] then + local n = tree[':node'] + tex.runtoks(function() + tex.sprint{mc_begin, string.format('{tag=%s}', tree[0])} + -- NOTE: This will also flush all previous sprint's... That's often annoying, but in this case actually intentional. + end) + node.set_attribute(tree[':node'], mc_type, tex.attribute[mc_type]) + node.set_attribute(tree[':node'], mc_cnt, tex.attribute[mc_cnt]) + tex.runtoks(function() + tex.sprint(mc_end) + end) + end + for _, elem in ipairs(tree) do + if type(elem) ~= 'string' then + write_elem(elem) + end + end + tex.runtoks(function() + tex.sprint(struct_end) + end) +end + +return function(element) + return write_elem(element) +end diff --git a/luamml-tex.lua b/luamml-tex.lua index 36edff8..852c93a 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -5,6 +5,7 @@ local register_family = mlist_to_mml.register_family local mappings = require'luamml-legacy-mappings' local write_xml = require'luamml-xmlwriter' +local write_struct = require'luamml-structelemwriter' local properties = node.get_properties_table() @@ -67,6 +68,9 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) if flag & 2 == 0 then save_result(xml, style == 'display' or flag & 1 == 1) end + if flag & 8 == 8 then + write_struct(make_root(mlist_result, mlist_display and 0 or 2)) + end if style == 'text' then local startmath = tex.nest.top.tail local props = properties[startmath] diff --git a/luamml-xmlwriter.lua b/luamml-xmlwriter.lua index efd5f4f..4f06842 100644 --- a/luamml-xmlwriter.lua +++ b/luamml-xmlwriter.lua @@ -18,7 +18,7 @@ local function write_elem(tree, indent) if not tree[0] then print('ERR', require'inspect'(tree)) end local escaped_name = escape_name(assert(tree[0])) local i = 0 - for attr, val in next, tree do if type(attr) == 'string' then + for attr, val in next, tree do if type(attr) == 'string' and string.byte(attr) ~= 0x3A then i = i + 1 attrs[i] = string.format(' %s="%s"', escape_name(attr), escape_text(val)) end end diff --git a/luamml.sty b/luamml.sty index f563a75..10e07ec 100644 --- a/luamml.sty +++ b/luamml.sty @@ -17,6 +17,9 @@ \cs_new:Nn \luamml_flag_alignment_right: { \int_set:Nn \l__luamml_flag_int { 6 } } +\cs_new:Nn \luamml_flag_structelem: { + \int_set:Nn \l__luamml_flag_int { 8 } +} \cs_new:Npn \__luamml_patch_package:nn #1 #2 { \@ifpackageloaded {#1} {#2} { diff --git a/test_tex.tex b/test_tex.tex index 55c341a..eb305dd 100644 --- a/test_tex.tex +++ b/test_tex.tex @@ -29,6 +29,7 @@ 2 & $else$ \end{cases} \] +\ShowMathMLObj \[ x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}. \] From 2974676fab604d78495253fe1f7a5a4f572f64c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 18 May 2021 19:27:54 +0200 Subject: [PATCH 006/206] Add interface for writing MathML into a file --- luamml-tex.lua | 12 ++++++++++++ luamml.sty | 14 +++++++++----- test_structelem.tex | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 test_structelem.tex diff --git a/luamml-tex.lua b/luamml-tex.lua index 852c93a..6f08ec5 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -7,6 +7,8 @@ local mappings = require'luamml-legacy-mappings' local write_xml = require'luamml-xmlwriter' local write_struct = require'luamml-structelemwriter' +local filename_token = token.create'l__luamml_filename_tl' + local properties = node.get_properties_table() local funcid = luatexbase.new_luafunction'RegisterFamilyMapping' @@ -39,8 +41,18 @@ end local mlist_buffer local mlist_result, mlist_display +local undefined_cmd = token.command_id'undefined_cs' +local call_cmd = token.command_id'call' + local function save_result(xml, display) mlist_result, mlist_display = xml, display + if filename_token.command ~= undefined_cmd then + assert(filename_token.command == call_cmd) + token.put_next(filename_token) + assert(io.open(token.scan_string(), 'w')) + :write(write_xml(make_root({[0] = 'mrow', xml}, display and 0 or 2)) .. '\n') + :close() + end if tex.count.tracingmathml > 1 then -- Here xml gets wrapped in an mrow to avoid modifying it. texio.write_nl(write_xml(make_root({[0] = 'mrow', xml}, display and 0 or 2)) .. '\n') diff --git a/luamml.sty b/luamml.sty index 10e07ec..c14f68e 100644 --- a/luamml.sty +++ b/luamml.sty @@ -2,24 +2,28 @@ {Feel free to add a description here} \int_new:N \l__luamml_flag_int +\tl_new:N \l__luamml_filename_tl \int_new:N \tracingmathml \lua_now:n { require'luamml-tex' } -\cs_new:Nn \luamml_flag_save: { +\cs_new:Npn \luamml_flag_save: { \int_set:Nn \l__luamml_flag_int { 2 } } -\cs_new:Nn \luamml_flag_ignore: { +\cs_new:Npn \luamml_flag_ignore: { \int_set:Nn \l__luamml_flag_int { 3 } } -\cs_new:Nn \luamml_flag_alignment_left: { +\cs_new:Npn \luamml_flag_alignment_left: { \int_set:Nn \l__luamml_flag_int { 7 } } -\cs_new:Nn \luamml_flag_alignment_right: { +\cs_new:Npn \luamml_flag_alignment_right: { \int_set:Nn \l__luamml_flag_int { 6 } } -\cs_new:Nn \luamml_flag_structelem: { +\cs_new:Npn \luamml_flag_structelem: { \int_set:Nn \l__luamml_flag_int { 8 } } +\cs_new:Npn \luamml_set_filename:n { + \tl_set:Nn \l__luamml_filename_tl +} \cs_new:Npn \__luamml_patch_package:nn #1 #2 { \@ifpackageloaded {#1} {#2} { diff --git a/test_structelem.tex b/test_structelem.tex new file mode 100644 index 0000000..5fd6e33 --- /dev/null +++ b/test_structelem.tex @@ -0,0 +1,34 @@ +% !Mode:: "TeX:DE:UTF-8:Main" +\PassOptionsToPackage{enable-debug,check-declarations}{expl3} +\RequirePackage{pdfmanagement-testphase} +\DeclareDocumentMetadata{uncompress,pdfversion=2.0} +\RequirePackage{expl3} +\documentclass{article} +\usepackage{unicode-math} +\usepackage{tagpdf} +\tagpdfsetup{activate-all,interwordspace=true,} +\usepackage{amsmath} +\usepackage{luamml} +% \RegisterFamilyMapping\symsymbols{oms} +% \RegisterFamilyMapping\symletters{oml} +% \RegisterFamilyMapping\symlargesymbols{omx} +\ExplSyntaxOn + +\luamml_flag_structelem: +\int_new:N \g__my_mathml_int +\luamml_set_filename:n { + \immediateassignment \int_gincr:N \g__my_mathml_int + \jobname -formula- \int_use:N \g__my_mathml_int .xml +} +\ExplSyntaxOff +\begin{document} +\tagstructbegin{tag=Document} +\tagstructbegin{tag=Formula} +\[ + ax^2+bx+c=0,\quad + \int_1^n f(x) = \sum_{i=1}^m x^4 dx +\] +\tagstructend +\tagstructend + +\end{document} From 1046e096eddad0455e4de8830dec51665f63593d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 18 May 2021 20:56:47 +0200 Subject: [PATCH 007/206] Fix missing filename case --- luamml-tex.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/luamml-tex.lua b/luamml-tex.lua index 6f08ec5..24b0072 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -46,10 +46,10 @@ local call_cmd = token.command_id'call' local function save_result(xml, display) mlist_result, mlist_display = xml, display - if filename_token.command ~= undefined_cmd then - assert(filename_token.command == call_cmd) - token.put_next(filename_token) - assert(io.open(token.scan_string(), 'w')) + token.put_next(filename_token) + local filename = token.scan_argument() + if filename ~= '' then + assert(io.open(filename, 'w')) :write(write_xml(make_root({[0] = 'mrow', xml}, display and 0 or 2)) .. '\n') :close() end From 913b7150e1ebf23a002d621581a47d9a507d3c24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 18 May 2021 21:01:48 +0200 Subject: [PATCH 008/206] Enable indentation / newlines in MathML writer --- luamml-tex.lua | 2 +- luamml-xmlwriter.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/luamml-tex.lua b/luamml-tex.lua index 24b0072..1ccea18 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -50,7 +50,7 @@ local function save_result(xml, display) local filename = token.scan_argument() if filename ~= '' then assert(io.open(filename, 'w')) - :write(write_xml(make_root({[0] = 'mrow', xml}, display and 0 or 2)) .. '\n') + :write(write_xml(make_root({[0] = 'mrow', xml}, display and 0 or 2), true):sub(2) .. '\n') :close() end if tex.count.tracingmathml > 1 then diff --git a/luamml-xmlwriter.lua b/luamml-xmlwriter.lua index 4f06842..38884ba 100644 --- a/luamml-xmlwriter.lua +++ b/luamml-xmlwriter.lua @@ -46,5 +46,5 @@ end return function(element, indent, version) return (version == '11' and '' or '') .. - write_elem(element, indent and '' or nil) + write_elem(element, indent and '\n' or nil) end From 6f92838e19eee4d2bc0360864d93970b3d25b36a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 21 May 2021 17:30:23 +0200 Subject: [PATCH 009/206] Small improvements/fixes --- luamml-tex.lua | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/luamml-tex.lua b/luamml-tex.lua index 1ccea18..f8d4b03 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -23,6 +23,14 @@ lua.get_functions_table()[funcid] = function() end end +local function shallow_copy(t) + local tt = {} + for k,v in next, t do + tt[k] = v + end + return tt +end + -- Possible flag values: -- 0: Normal (This is the only supported one in display mode) -- 1: Like 0, result is display math @@ -48,14 +56,16 @@ local function save_result(xml, display) mlist_result, mlist_display = xml, display token.put_next(filename_token) local filename = token.scan_argument() + local tracing = tex.count.tracingmathml > 1 + local xml_root = (filename ~= '' or tracing) and make_root(shallow_copy(xml), display and 0 or 2) if filename ~= '' then assert(io.open(filename, 'w')) - :write(write_xml(make_root({[0] = 'mrow', xml}, display and 0 or 2), true):sub(2) .. '\n') + :write(write_xml(xml_root, true):sub(2) .. '\n') :close() end - if tex.count.tracingmathml > 1 then + if tracing then -- Here xml gets wrapped in an mrow to avoid modifying it. - texio.write_nl(write_xml(make_root({[0] = 'mrow', xml}, display and 0 or 2)) .. '\n') + texio.write_nl(write_xml(xml_root) .. '\n') end end @@ -81,7 +91,7 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) save_result(xml, style == 'display' or flag & 1 == 1) end if flag & 8 == 8 then - write_struct(make_root(mlist_result, mlist_display and 0 or 2)) + write_struct(make_root(shallow_copy(xml), (style == 'display' or flag & 1 == 1) and 0 or 2)) end if style == 'text' then local startmath = tex.nest.top.tail From ec8fd3c1a862058079e43022774f5ce79c7d06b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 24 May 2021 18:41:12 +0200 Subject: [PATCH 010/206] Only mark symbols belonging to MML token elements --- luamml-convert.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index 0676ad7..6ff524e 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -306,7 +306,7 @@ local function radical_to_table(radical, sub, cur_style) local elem if kind == 'radical' or kind == 'uradical' then -- FIXME: Check that this is really a square root - elem, core = {[0] = 'msqrt', nucleus, [':node'] = left[':node'], }, nil + elem, core = {[0] = 'msqrt', nucleus, }, nil elseif kind == 'uroot' then -- FIXME: Check that this is really a root elem, core = {[0] = 'msqrt', nucleus, kernel_to_table(radical.degree)}, nil @@ -332,7 +332,6 @@ local function fraction_to_table(fraction, sub, cur_style) local mfrac = {[0] = 'mfrac', linethickness = fraction.width and fraction.width == 0 and 0 or nil, bevelled = fraction.middle and "true" or nil, - [':node'] = fraction, num, denom, } From ebc813d299c73bfa1708885a86a15d54dee52cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 27 May 2021 03:15:24 +0200 Subject: [PATCH 011/206] Prepare support for preexisting structure elements --- luamml-structelemwriter.lua | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index 31afb0c..6cc00a6 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -1,4 +1,5 @@ local struct_begin = token.create'tag_struct_begin:n' +local struct_use = token.create'tag_struct_use:n' local struct_end = token.create'tag_struct_end:' local mc_begin = token.create'tag_mc_begin:n' @@ -40,6 +41,11 @@ local mc_cnt = token.create'l__tag_mc_cnt_attr'.index local attrs = {} local function write_elem(tree, indent) + if tree[':struct'] then + return tex.runtoks(function() + return tex.sprint(struct_use, '{', tree[':struct'], '}') + end) + end if not tree[0] then print('ERR', require'inspect'(tree)) end local i = 0 for attr, val in next, tree do if type(attr) == 'string' and not string.find(attr, ':') and attr ~= 'xmlns' then @@ -49,11 +55,11 @@ local function write_elem(tree, indent) end end table.sort(attrs) local attr_name - if i == 0 then - tex.sprint{struct_begin, string.format('{tag=%s/mathml}', tree[0])} - else - tex.sprint{struct_begin, string.format('{tag=%s/mathml,attribute=%s}', tree[0], attributes[table.concat(attrs)])} + tex.sprint(struct_begin, '{tag=', tree[0], '/mathml') + if i ~= 0 then + tex.sprint(',attribute=', attributes[table.concat(attrs)]) end + tex.sprint'}' for j = 1, i do attrs[j] = nil end if tree[':node'] then From c9904b3bc51bc3ce180ae5d35335d10342491175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 27 May 2021 05:03:07 +0200 Subject: [PATCH 012/206] Add support for mathml_filter --- luamml-convert.lua | 68 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index 6ff524e..9f8979d 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -121,16 +121,27 @@ local function sup_style(s) return s//4*2+4+s%2 end -- We ignore large_... since they aren't used for modern fonts local function delim_to_table(delim) if not delim then return end - local props = properties[delim] props = props and props.mathml_table - if props then return props end + local props = properties[delim] + local mathml_table = props and props.mathml_table + if mathml_table then return mathml_table end + local mathml_filter = props and props.mathml_filter -- Kind of pointless since the arguments are literals, but present for consistency local char = delim.small_char if char == 0 then - return {[0] = 'mspace', width = string.format("%.3fpt", tex.nulldelimiterspace/65781.76)}, space_like + local result = {[0] = 'mspace', width = string.format("%.3fpt", tex.nulldelimiterspace/65781.76)} + if mathml_filter then + return mathml_filter(result, space_like) + else + return result, space_like + end else local fam = delim.small_fam char = remap_lookup[fam << 21 | char] local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = not stretchy[char] or nil, lspace = 0, rspace = 0, [':node'] = delim } - return result, result + if mathml_filter then + return mathml_filter(result, result) + else + return result, result + end end end @@ -138,24 +149,33 @@ end -- No lspace or space is set here since these never appear as core operators in an mrow. local function acc_to_table(acc, cur_style, stretch) if not acc then return end - local props = properties[acc] props = props and props.mathml_table - if props then return props end + local props = properties[acc] + local mathml_table = props and props.mathml_table + if mathml_table then return mathml_table end if acc.id ~= math_char_t then error'confusion' end + local mathml_filter = props and props.mathml_filter -- Kind of pointless since the arguments are literals, but present for consistency local fam = acc.fam local char = remap_lookup[fam << 21 | acc.char] char = remap_comb[char] or char if stretch ~= not stretchy[char] then -- Handle nil gracefully in stretchy stretch = nil end - return {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = stretch, [':node'] = acc} + local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = stretch, [':node'] = acc} + if mathml_filter then + return mathml_filter(result) + else + return result + end end local function kernel_to_table(kernel, cur_style) if not kernel then return end - local props = properties[kernel] props = props and props.mathml_table - if props then return props, user_provided end + local props = properties[kernel] + local mathml_table = props and props.mathml_table + if mathml_table then return mathml_table, user_provided end + local mathml_filter = props and props.mathml_filter -- Kind of pointless since the arguments are literals, but present for consistency local id = kernel.id if id == math_char_t then local fam = kernel.fam @@ -167,17 +187,28 @@ local function kernel_to_table(kernel, cur_style) mathvariant = utf8.len(char) == 1 and elem == 'mi' and utf8.codepoint(char) < 0x10000 and 'normal' or nil, [':node'] = kernel, } - return result, result + if mathml_filter then + return mathml_filter(result, result) + else + return result, result + end elseif id == sub_box_t then if kernel.list.id == hlist_t then -- We directly give up for vlists local result = to_text(kernel.list.head) - return result, result else local result = {[0] = 'mi', {[0] = 'mglyph', ['tex:box'] = kernel.list, [':node'] = kernel}} + end + if mathml_filter then + return mathml_filter(result, result) + else return result, result end elseif id == sub_mlist_t then - return nodes_to_table(kernel.list, cur_style) + if mathml_filter then + return mathml_filter(nodes_to_table(kernel.list, cur_style)) + else + return nodes_to_table(kernel.list, cur_style) + end else error'confusion' end @@ -436,9 +467,9 @@ function nodes_to_table(head, cur_style) for n, id, sub in node.traverse(head) do local new_core, new_mn, new_node, new_noad local props = properties[n] - props = props and props.mathml_table - if props then - new_node, new_core = props, user_provided + local mathml_table = props and props.mathml_table + if mathml_table then + new_node, new_core = mathml_table, user_provided elseif id == noad_t then local new_n new_n, new_core, new_mn = noad_to_table(n, sub, cur_style, mn) @@ -534,7 +565,12 @@ function nodes_to_table(head, cur_style) assert(t == result) result = t[1] end - return result, core + local mathml_filter = props and props.mathml_filter + if mathml_filter then + return mathml_filter(result, core) + else + return result, core + end end local function register_remap(family, mapping) From 1961c2445c0ad981de2ff725d989c81af4b37214 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 27 May 2021 07:35:12 +0200 Subject: [PATCH 013/206] Forgot interction of metatable --- luamml-structelemwriter.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index 6cc00a6..56f99d3 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -55,11 +55,11 @@ local function write_elem(tree, indent) end end table.sort(attrs) local attr_name - tex.sprint(struct_begin, '{tag=', tree[0], '/mathml') - if i ~= 0 then - tex.sprint(',attribute=', attributes[table.concat(attrs)]) + if i == 0 then + tex.sprint(struct_begin, '{tag=', tree[0], '/mathml}') + else + tex.sprint(struct_begin, '{tag=', tree[0], '/mathml,attribute=', attributes[table.concat(attrs)], '}') end - tex.sprint'}' for j = 1, i do attrs[j] = nil end if tree[':node'] then From 207ea33a4e031363b2e85b5158c922f868e55e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 27 May 2021 14:45:31 +0200 Subject: [PATCH 014/206] Fix wrong local --- luamml-convert.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index 9f8979d..bea7eca 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -193,10 +193,11 @@ local function kernel_to_table(kernel, cur_style) return result, result end elseif id == sub_box_t then + local result if kernel.list.id == hlist_t then -- We directly give up for vlists - local result = to_text(kernel.list.head) + result = to_text(kernel.list.head) else - local result = {[0] = 'mi', {[0] = 'mglyph', ['tex:box'] = kernel.list, [':node'] = kernel}} + result = {[0] = 'mi', {[0] = 'mglyph', ['tex:box'] = kernel.list, [':node'] = kernel}} end if mathml_filter then return mathml_filter(result, result) From f982de18eeb9aabb3abb2aeb70c274543f66b315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 28 May 2021 18:25:25 +0200 Subject: [PATCH 015/206] Baby steps towards pdfTeX comptibility --- parse_showlists.lua | 84 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 parse_showlists.lua diff --git a/parse_showlists.lua b/parse_showlists.lua new file mode 100644 index 0000000..7d15f81 --- /dev/null +++ b/parse_showlists.lua @@ -0,0 +1,84 @@ +local l = lpeg or require'lpeg' +local hex_digit = l.R('09', 'af') +local function hex_to_int(s) return tonumber(s, 16) end +local tex_char = l.Cg('^^' * (hex_digit * hex_digit / hex_to_int + + l.R'\0\x3F' / function(s) return s:byte() + 0x40 end + + l.R'\x40\x7F' / function(s) return s:byte() - 0x40 end) + + l.P(1) / string.byte) + +local scaled = l.R'09'^1 * '.' * l.R'09'^1 / function(s) return (tonumber(s * 0x10000) + .5) // 1 end +local delimiter_code = '"' * (l.R('09', 'AF')^1 / function(s) + local code = tonumber(s, 16) + return {id = 'delim', + small_fam = (code >> 20) & 0xF, + small_char = (code >> 16) & 0xFF, + large_fam = (code >> 4) & 0xF, + large_char = code & 0xFF, + } +end) + +local math_char = l.Ct('\\fam' * l.Cg(l.R'09'^1 / tonumber, 'fam') * ' ' * l.Cg(tex_char, 'char') * l.Cg(l.Cc'math_char', 'id')) + +local simple_noad = l.Ct( + '\\math' * l.Cg( + 'ord' * l.Cc(0) + + 'op' * l.Cc(1) + + 'bin' * l.Cc(4) + + 'rel' * l.Cc(5) + + 'open' * l.Cc(6) + + 'close' * l.Cc(7) + + 'punct' * l.Cc(8) + + 'inner' * l.Cc(9) + , 'subtype') * l.Cg(l.Cc'noad', 'id') + + '\\radical' * l.Cg(delimiter_code, 'left') * l.Cg(l.Cc'radical', 'id') + + '\\accent' * l.Cg(math_char, 'accent') * l.Cg(l.Cc'accent', 'id') + + l.Cg('\\left' * l.Cc(1) + + '\\middle' * l.Cc(2) + + '\\right' * l.Cc(3), 'subtype') * l.Cg(delimiter_code, 'delim') * l.Cg(l.Cc'fence', 'id') + ) * -1 + +local fraction_noad = l.Ct('\\fraction, thickness ' * l.Cg('= default' * l.Cc(0x40000000) + scaled, 'width') + * l.Cg(', left-delimiter ' * delimiter_code, 'left')^-1 * l.Cg(', right-delimiter ' * delimiter_code, 'right')^-1) + * -1 + +local parse_list +local function parse_kernel(lines, i, prefix) + local line = lines[i] + if not line or line:sub(1, #prefix) ~= prefix then return nil, i end + local result = math_char:match(lines[i], #prefix + 1) + if result then return result, i+1 end + result, i = parse_list(lines, i, prefix) + return {list = result, id = 'sub_mlist'}, i +end +function parse_list(lines, i, prefix) + i = i or 1 + prefix = prefix or '' + local list = {} + while true do + local line = lines[i] + if not line or line:sub(1, #prefix) ~= prefix then break end + local simple = simple_noad:match(line, #prefix+1) + if simple then + simple.nucleus, i = parse_kernel(lines, i + 1, prefix .. '.') + simple.sup, i = parse_kernel(lines, i, prefix .. '^') + simple.sub, i = parse_kernel(lines, i, prefix .. '_') + list[#list + 1] = simple + else + local fraction = fraction_noad:match(line, #prefix+1) + if fraction then + fraction.num, i = parse_kernel(lines, i + 1, prefix .. '\\') + fraction.denom, i = parse_kernel(lines, i, prefix .. '/') + list[#list + 1] = fraction + else + print('unknown noad ' .. line:sub(#prefix+1)) + i = i + 1 + end + end + end + return list, i +end +local lines = {} +for l in io.lines() do + lines[#lines + 1] = l ~= '' and l or nil +end +print(require'inspect'((parse_list(lines)))) From 7a2a93fe5aab3529c31e2ed6d3d9f29c455e0316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 29 May 2021 12:39:24 +0200 Subject: [PATCH 016/206] Working \showlists parsing experiment --- emulated_nodes.lua | 36 +++++++++++++++++++++ parse_showlists.lua | 42 +++++++++++++++--------- showlists_test.lua | 79 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+), 16 deletions(-) create mode 100644 emulated_nodes.lua create mode 100644 showlists_test.lua diff --git a/emulated_nodes.lua b/emulated_nodes.lua new file mode 100644 index 0000000..c7f6135 --- /dev/null +++ b/emulated_nodes.lua @@ -0,0 +1,36 @@ +local properties = {} +local subtypes = { + noad = {[0] = 'ord', 'opdisplaylimits', 'oplimits', 'opnolimits', 'bin', 'rel', 'open', 'close', 'punct', 'inner', 'under', 'over', 'vcenter'}, + fence = {[0] = 'unset', 'left', 'middle', 'right', 'no'}, + radical = {[0] = 'radical', 'uradical', 'uroot', 'uunderdelimiter', 'uoverdelimiter', 'udelimiterunder', 'udelimiterover'}, +} +local function traverse_iter(context, head) + if head == nil then + head = context + else + head = head.next + end + if head then + return head, head.id, head.subtype + else + return nil + end +end +node = { + get_properties_table = function() + return properties + end, + id = function(name) + return name + end, + is_node = function(node) + return type(node) == 'table' and node.id and true or false + end, + subtypes = function(id) + return subtypes[id] + end, + traverse = function(head) + return traverse_iter, head, nil + end, +} +tex.nulldelimiterspace = tex.nulldelimiterspace or 78643 -- 1.2pt diff --git a/parse_showlists.lua b/parse_showlists.lua index 7d15f81..fc8cb41 100644 --- a/parse_showlists.lua +++ b/parse_showlists.lua @@ -11,8 +11,8 @@ local delimiter_code = '"' * (l.R('09', 'AF')^1 / function(s) local code = tonumber(s, 16) return {id = 'delim', small_fam = (code >> 20) & 0xF, - small_char = (code >> 16) & 0xFF, - large_fam = (code >> 4) & 0xF, + small_char = (code >> 12) & 0xFF, + large_fam = (code >> 8) & 0xF, large_char = code & 0xFF, } end) @@ -22,6 +22,8 @@ local math_char = l.Ct('\\fam' * l.Cg(l.R'09'^1 / tonumber, 'fam') * ' ' * l.Cg( local simple_noad = l.Ct( '\\math' * l.Cg( 'ord' * l.Cc(0) + + 'op\\limits' * l.Cc(2) + + 'op\\nolimits' * l.Cc(3) + 'op' * l.Cc(1) + 'bin' * l.Cc(4) + 'rel' * l.Cc(5) @@ -29,16 +31,21 @@ local simple_noad = l.Ct( + 'close' * l.Cc(7) + 'punct' * l.Cc(8) + 'inner' * l.Cc(9) + + 'under' * l.Cc(10) + + 'over' * l.Cc(11) + + 'vcenter' * l.Cc(12) , 'subtype') * l.Cg(l.Cc'noad', 'id') - + '\\radical' * l.Cg(delimiter_code, 'left') * l.Cg(l.Cc'radical', 'id') - + '\\accent' * l.Cg(math_char, 'accent') * l.Cg(l.Cc'accent', 'id') + + '\\radical' * l.Cg(delimiter_code, 'left') * l.Cg(l.Cc(0), 'subtype') * l.Cg(l.Cc'radical', 'id') + + '\\accent' * l.Cg(math_char, 'accent') * l.Cg(l.Cc(0), 'subtype') * l.Cg(l.Cc'accent', 'id') + l.Cg('\\left' * l.Cc(1) + '\\middle' * l.Cc(2) - + '\\right' * l.Cc(3), 'subtype') * l.Cg(delimiter_code, 'delim') * l.Cg(l.Cc'fence', 'id') + + '\\right' * l.Cc(3), 'subtype') * l.Cg(delimiter_code, 'delim') * l.Cg(l.Cc(0), 'class') * l.Cg(l.Cc'fence', 'id') ) * -1 -local fraction_noad = l.Ct('\\fraction, thickness ' * l.Cg('= default' * l.Cc(0x40000000) + scaled, 'width') - * l.Cg(', left-delimiter ' * delimiter_code, 'left')^-1 * l.Cg(', right-delimiter ' * delimiter_code, 'right')^-1) +local fraction_noad = l.Ct('\\fraction, thickness ' + * l.Cg('= default' * l.Cc(0x40000000) + scaled, 'width') + * l.Cg(', left-delimiter ' * delimiter_code, 'left')^-1 * l.Cg(', right-delimiter ' * delimiter_code, 'right')^-1 + * l.Cg(l.Cc'fraction', 'id')) * -1 local parse_list @@ -53,7 +60,7 @@ end function parse_list(lines, i, prefix) i = i or 1 prefix = prefix or '' - local list = {} + local head, last while true do local line = lines[i] if not line or line:sub(1, #prefix) ~= prefix then break end @@ -62,23 +69,26 @@ function parse_list(lines, i, prefix) simple.nucleus, i = parse_kernel(lines, i + 1, prefix .. '.') simple.sup, i = parse_kernel(lines, i, prefix .. '^') simple.sub, i = parse_kernel(lines, i, prefix .. '_') - list[#list + 1] = simple + if last then + simple.prev, last.next = last, simple + end + last = simple else local fraction = fraction_noad:match(line, #prefix+1) if fraction then fraction.num, i = parse_kernel(lines, i + 1, prefix .. '\\') fraction.denom, i = parse_kernel(lines, i, prefix .. '/') - list[#list + 1] = fraction + if last then + fraction.prev, last.next = last, fraction + end + last = fraction else print('unknown noad ' .. line:sub(#prefix+1)) i = i + 1 end end + if not head then head = last end end - return list, i + return head, i end -local lines = {} -for l in io.lines() do - lines[#lines + 1] = l ~= '' and l or nil -end -print(require'inspect'((parse_list(lines)))) +return parse_list diff --git a/showlists_test.lua b/showlists_test.lua new file mode 100644 index 0000000..78680a9 --- /dev/null +++ b/showlists_test.lua @@ -0,0 +1,79 @@ +local parse_showlists = require'parse_showlists' +local l = lpeg or require'lpeg' + +local lines = l.Ct((l.C((1-l.P'\n')^0) * '\n')^0 * l.C(l.P(1)^1)^-1):match( +[[\mathinner +.\left"28300 +.\mathord +..\fraction, thickness 0.0, left-delimiter "28300, right-delimiter "29301 +..\\mathord +..\.\fam0 1 +../\mathord +../.\fam0 1 +.\mathord +..\fam1 x +._\mathord +._.\fam0 1 +._\mathord +._.\fam1 = +._\mathord +._.\fam0 2 +.\mathbin +..\fam0 + +.\accent\fam0 _ +..\fam1 z +._\fam0 0 +.\middle"26A30C +.\mathrel +..\fam0 = +.\mathop\limits +..\fam3 P +.\mathop\nolimits +..\fam3 P +.\mathop +..\fam3 P +.^\mathord +.^.\fam0 1 +.^\mathord +.^.\fam0 0 +.^\mathord +.^.\fam0 0 +.^\mathord +.^.\fam0 0 +._\mathord +._.\fam1 i +._\mathrel +._.\fam0 = +._\mathord +._.\fam0 1 +.\mathord +..\fraction, thickness = default +..\\mathbin +..\.\fam2 ^^@ +..\\mathord +..\.\fam1 p +..\\mathbin +..\.\fam2 ^^F +..\\radical"270370 +..\.\mathord +..\..\fam1 p +..\.\mathbin +..\..\fam2 ^^@ +..\.\mathord +..\..\fam0 4 +..\.\mathord +..\..\fam1 q +../\mathord +../.\fam0 2 +.\right"0 +]]) + +local parsed = parse_showlists(lines) +require'emulated_nodes' +local convert = require'luamml-convert' +local mappings = require'luamml-legacy-mappings' +convert.register_family(1, mappings.oml) +convert.register_family(2, mappings.oms) +convert.register_family(3, mappings.omx) +local to_xml = require'luamml-xmlwriter' +print(to_xml(convert.make_root(convert.process(parsed), 2))) From 483ab6a572aa02fb9b45bb72f7ba0159364be8ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 29 May 2021 13:34:38 +0200 Subject: [PATCH 017/206] Remaining noads --- parse_showlists.lua | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/parse_showlists.lua b/parse_showlists.lua index fc8cb41..b6589d8 100644 --- a/parse_showlists.lua +++ b/parse_showlists.lua @@ -40,6 +40,11 @@ local simple_noad = l.Ct( + l.Cg('\\left' * l.Cc(1) + '\\middle' * l.Cc(2) + '\\right' * l.Cc(3), 'subtype') * l.Cg(delimiter_code, 'delim') * l.Cg(l.Cc(0), 'class') * l.Cg(l.Cc'fence', 'id') + + '\\' * l.Cg( + 'display' * l.Cc(0) + + 'text' * l.Cc(2) + + 'scriptscript' * l.Cc(6) + + 'script' * l.Cc(4), 'subtype') * l.Cg('style', 'id') ) * -1 local fraction_noad = l.Ct('\\fraction, thickness ' @@ -48,6 +53,8 @@ local fraction_noad = l.Ct('\\fraction, thickness ' * l.Cg(l.Cc'fraction', 'id')) * -1 +local mathchoice_noad = l.Ct('\\mathchoice' * l.Cg(l.Cc'choice', 'id') * -1) + local parse_list local function parse_kernel(lines, i, prefix) local line = lines[i] @@ -83,8 +90,21 @@ function parse_list(lines, i, prefix) end last = fraction else - print('unknown noad ' .. line:sub(#prefix+1)) - i = i + 1 + local mathchoice = mathchoice_noad:match(line, #prefix+1) + if mathchoice then + mathchoice.display, i = parse_list(lines, i + 1, prefix .. 'D') + mathchoice.text, i = parse_list(lines, i, prefix .. 'T') + mathchoice.script, i = parse_list(lines, i, prefix .. 'S') + mathchoice.scriptscript, i = parse_list(lines, i, prefix .. 's') + if last then + mathchoice.prev, last.next = last, mathchoice + end + last = mathchoice + else + print(line, prefix, i) + print('unknown noad ' .. line:sub(#prefix+1)) + i = i + 1 + end end end if not head then head = last end From ba4b30d49b01aa41feae615d38934bec45f3bdca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 30 May 2021 03:29:50 +0200 Subject: [PATCH 018/206] Parse log file --- showlists_test.lua | 205 +++++++++++++++++++++++++++++++++------------ 1 file changed, 153 insertions(+), 52 deletions(-) diff --git a/showlists_test.lua b/showlists_test.lua index 78680a9..5c25b00 100644 --- a/showlists_test.lua +++ b/showlists_test.lua @@ -1,6 +1,35 @@ +require'emulated_nodes' +local convert = require'luamml-convert' +local mappings = require'luamml-legacy-mappings' +local to_xml = require'luamml-xmlwriter' +convert.register_family(1, mappings.oml) +convert.register_family(2, mappings.oms) +convert.register_family(3, mappings.omx) + local parse_showlists = require'parse_showlists' local l = lpeg or require'lpeg' +local line = (1-l.P'\n')^0 * '\n' +local Cline = l.C((1-l.P'\n')^0) * '\n' + +local list_block = (l.C(l.S'\\._^/ps' * (1-l.P'\n')^0)^-1 * '\n')^0 +local math_lists_block = l.Ct('### ' * l.Cg(l.C'display' * ' ', 'display')^-1 * 'math mode entered at line ' * l.Cg(l.R'09'^1 / tonumber, 'line') * '\n' + * list_block)^1 +local generic_list_block = '### ' * line * list_block +local luamml_block = l.Ct('LUAMML_META_BEGIN\n\n' + * (math_lists_block + generic_list_block/0)^0 + * (line - 'LUAMML_META_END\n')^0 + * 'LUAMML_META_END\n') + +local math_lists = (function() + local f = assert(io.open(arg[1], 'r')) + local content = f:read'a' + f:close() + -- The following does *not* end with * -1 since we want to allow the last line to not end with \n. + -- In that case we ignore the last line, but that's safe since the last line never contains our markers. + local log_file = l.Ct((luamml_block + line)^0) + return log_file:match(content) +end)() local lines = l.Ct((l.C((1-l.P'\n')^0) * '\n')^0 * l.C(l.P(1)^1)^-1):match( [[\mathinner .\left"28300 @@ -18,62 +47,134 @@ local lines = l.Ct((l.C((1-l.P'\n')^0) * '\n')^0 * l.C(l.P(1)^1)^-1):match( ._.\fam1 = ._\mathord ._.\fam0 2 +.\mathchoice +.D\mathord +.D.\fam1 d +.D\mathord +.D.\fam1 i +.D\mathord +.D.\fam1 s +.D\mathord +.D.\fam1 p +.D\mathord +.D.\fam1 l +.D\mathord +.D.\fam1 a +.D\mathord +.D.\fam1 y +.D\scriptstyle +.D\mathord +.D.\fam1 a +.D\mathord +.D.\fam1 b +.D\mathord +.D.\fam1 c +.T\mathord +.T.\fam1 t +.T\mathord +.T.\fam1 e +.T\mathord +.T.\fam1 x +.T\mathord +.T.\fam1 t +.T\scriptscriptstyle +.T\mathord +.T.\fam1 a +.T\mathord +.T.\fam1 b +.T\mathord +.T.\fam1 c +.S\mathord +.S.\fam1 s +.S\mathord +.S.\fam1 c +.S\mathord +.S.\fam1 r +.S\mathord +.S.\fam1 i +.S\mathord +.S.\fam1 p +.S\mathord +.S.\fam1 t +.S\textstyle +.S\mathord +.S.\fam1 a +.S\mathord +.S.\fam1 b +.S\mathord +.S.\fam1 c +.s\mathord +.s.\fam1 s +.s\mathord +.s.\fam1 c +.s\mathord +.s.\fam1 r +.s\mathord +.s.\fam1 i +.s\mathord +.s.\fam1 p +.s\mathord +.s.\fam1 t +.s\mathord +.s.\fam1 s +.s\mathord +.s.\fam1 c +.s\mathord +.s.\fam1 r +.s\mathord +.s.\fam1 i +.s\mathord +.s.\fam1 p +.s\mathord +.s.\fam1 t +.s\displaystyle +.s\mathord +.s.\fam1 a +.s\mathord +.s.\fam1 b +.s\mathord +.s.\fam1 c .\mathbin ..\fam0 + .\accent\fam0 _ ..\fam1 z ._\fam0 0 -.\middle"26A30C -.\mathrel -..\fam0 = -.\mathop\limits -..\fam3 P -.\mathop\nolimits -..\fam3 P -.\mathop -..\fam3 P -.^\mathord -.^.\fam0 1 -.^\mathord -.^.\fam0 0 -.^\mathord -.^.\fam0 0 -.^\mathord -.^.\fam0 0 -._\mathord -._.\fam1 i -._\mathrel -._.\fam0 = -._\mathord -._.\fam0 1 -.\mathord -..\fraction, thickness = default -..\\mathbin -..\.\fam2 ^^@ -..\\mathord -..\.\fam1 p -..\\mathbin -..\.\fam2 ^^F -..\\radical"270370 -..\.\mathord -..\..\fam1 p -..\.\mathbin -..\..\fam2 ^^@ -..\.\mathord -..\..\fam0 4 -..\.\mathord -..\..\fam1 q -../\mathord -../.\fam0 2 -.\right"0 +.\right"29301 +\mathrel +.\fam0 = +\mathop\nolimits +.\fam3 P +^\fam0 1 +_\mathord +_.\fam1 i +_\mathrel +_.\fam0 = +_\mathord +_.\fam0 1 +\mathord +.\fraction, thickness = default +.\\mathbin +.\.\fam2 ^^@ +.\\mathord +.\.\fam1 p +.\\mathbin +.\.\fam2 ^^F +.\\radical"270370 +.\.\mathord +.\..\fam1 p +.\.\mathbin +.\..\fam2 ^^@ +.\.\mathord +.\..\fam0 4 +.\.\mathord +.\..\fam1 q +./\mathord +./.\fam0 2 ]]) -local parsed = parse_showlists(lines) -require'emulated_nodes' -local convert = require'luamml-convert' -local mappings = require'luamml-legacy-mappings' -convert.register_family(1, mappings.oml) -convert.register_family(2, mappings.oms) -convert.register_family(3, mappings.omx) -local to_xml = require'luamml-xmlwriter' -print(to_xml(convert.make_root(convert.process(parsed), 2))) +for i, block in ipairs(math_lists) do + block = block[1] + local parsed = parse_showlists(block) + local style = block.display and 0 or 2 + print(to_xml(convert.make_root(convert.process(parsed, style), style))) +end From 87e67e0807de56f8b75f88fdf54cce6c7675e40b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 30 May 2021 03:45:14 +0200 Subject: [PATCH 019/206] Fix typo --- luamml-convert.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index bea7eca..b59b58f 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -251,7 +251,7 @@ local function noad_to_table(noad, sub, cur_style, mn) if sub == noad_ord then if core and core[0] == 'mo' then core[0] = 'mi' - core.mathvariant = #core == 1 and type(core[0]) == 'string' and utf8.len(core[0]) == 1 and utf8.codepoint(core[0]) < -0x10000 and 'normal' or nil + core.mathvariant = #core == 1 and type(core[1]) == 'string' and utf8.len(core[1]) == 1 and utf8.codepoint(core[1]) < 0x10000 and 'normal' or nil core['tex:class'], core.stretchy, core.lspace, core.rspace = nil end if nucleus == core and #core == 1 then From 80f95f575ae9cb1730c949c1e1d4e469c62c21c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 30 May 2021 20:37:03 +0200 Subject: [PATCH 020/206] Support sized delimiters --- luamml-convert.lua | 44 ++++++++++++++++++++++++++++++++------ luamml-patches-amsmath.sty | 8 +++++++ parse_showlists.lua | 5 ++++- test_tex.tex | 2 +- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index b59b58f..2dfa8b0 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -248,11 +248,18 @@ end local function noad_to_table(noad, sub, cur_style, mn) local nucleus, core = kernel_to_table(noad.nucleus, sub == noad_over and cur_style//2*2+1 or cur_style) + if core and core[0] == 'mo' and core.minsize and not core.maxsize then + core.maxsize = core.minsize -- This happens when a half-specified delimiter appears alone in a list. + -- If it has a minimal size, it should be fixed to that size (since there is nothing bigger in it's list) + end if sub == noad_ord then if core and core[0] == 'mo' then - core[0] = 'mi' - core.mathvariant = #core == 1 and type(core[1]) == 'string' and utf8.len(core[1]) == 1 and utf8.codepoint(core[1]) < 0x10000 and 'normal' or nil - core['tex:class'], core.stretchy, core.lspace, core.rspace = nil + core['tex:class'] = nil + if not core.minsize then + core[0] = 'mi' + core.mathvariant = #core == 1 and type(core[1]) == 'string' and utf8.len(core[1]) == 1 and utf8.codepoint(core[1]) < 0x10000 and 'normal' or nil + core.stretchy, core.lspace, core.rspace = nil + end end if nucleus == core and #core == 1 then if mn and core[0] == 'mi' and (core[1] == '.' or core[1] == ',') and maybe_to_mn(noad, core) or core[0] == 'mn' then @@ -275,7 +282,9 @@ local function noad_to_table(noad, sub, cur_style, mn) -- TODO else core[0] = 'mo' - if stretchy[core[1]] then core.stretchy = false end + if not core.minsize then + if stretchy[core[1]] then core.stretchy = false end + end if core.mathvariant == 'normal' then core.mathvariant = nil end core.lspace, core.rspace = 0, 0 end @@ -385,8 +394,31 @@ end local function fence_to_table(fence, sub, cur_style) local delim, core = delim_to_table(fence.delim) - if delim[0] == 'mo' then - delim.fence = 'true' + if core[0] ~= 'mo' then + return delim, core + end + core.fence, core.symmetric = 'true', 'true' + local options = fence.options + local axis + if fence.height ~= 0 or fence.depth ~= 0 then + axis = 0xA == options & 0xA + local exact = 0x18 == options & 0x18 + -- We treat them always as exact. mpadded would allow us to support + -- non-exact ones too and I will implement that if I ever encounter + -- someone who does that intentionally. Until then, we warn people + -- since such fences are absurd. + if not exact then + texio.write_nl'luamml: The document uses a fence with \z + explicit dimensions but without the "exact" option. \z + This is probably a mistake.' + end + core.minsize = string.format("%.3fpt", (fence.height + fence.depth)/65781.76) + core.maxsize = core.minsize + else + axis = 0xC ~= options & 0xC + end + if not axis then + texio.write_nl'luamml: Baseline centered fence will be centered around math axis instead' end return delim, core end diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 421f47d..daabb73 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -107,3 +107,11 @@ \fi \ignorespacesafterend } + +\cs_set:Npn \bBigg@ #1 #2 { + { + \ensuremath { + \Uvextensible height~#1 \big@size axis~exact~#2 + } + } +} diff --git a/parse_showlists.lua b/parse_showlists.lua index b6589d8..321aa6d 100644 --- a/parse_showlists.lua +++ b/parse_showlists.lua @@ -39,7 +39,10 @@ local simple_noad = l.Ct( + '\\accent' * l.Cg(math_char, 'accent') * l.Cg(l.Cc(0), 'subtype') * l.Cg(l.Cc'accent', 'id') + l.Cg('\\left' * l.Cc(1) + '\\middle' * l.Cc(2) - + '\\right' * l.Cc(3), 'subtype') * l.Cg(delimiter_code, 'delim') * l.Cg(l.Cc(0), 'class') * l.Cg(l.Cc'fence', 'id') + + '\\right' * l.Cc(3), 'subtype') * l.Cg(delimiter_code, 'delim') + * l.Cg(l.Cc(0), 'options') * l.Cg(l.Cc(0), 'height') + * l.Cg(l.Cc(0), 'depth') * l.Cg(l.Cc(0), 'height') + * l.Cg(l.Cc(-1), 'class') * l.Cg(l.Cc'fence', 'id') + '\\' * l.Cg( 'display' * l.Cc(0) + 'text' * l.Cc(2) diff --git a/test_tex.tex b/test_tex.tex index eb305dd..3b021a9 100644 --- a/test_tex.tex +++ b/test_tex.tex @@ -39,7 +39,7 @@ \begin{align} abc&=def & e^{\mathrm{i}\pi}&=-1\\ - 1+2&=3\\ + \Big(1+2&=3\Big)\\ 5 \end{align} From a30b875e7a4b878610154fa6ae7ea43006129441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 31 May 2021 00:26:35 +0200 Subject: [PATCH 021/206] Support \phantom and friends --- luamml-kernel.lua | 42 +++++++++++++++++++++++++++++++++++++++ luamml-patches-kernel.sty | 16 +++++++++++++++ luamml.sty | 1 + 3 files changed, 59 insertions(+) create mode 100644 luamml-kernel.lua create mode 100644 luamml-patches-kernel.sty diff --git a/luamml-kernel.lua b/luamml-kernel.lua new file mode 100644 index 0000000..f326ce9 --- /dev/null +++ b/luamml-kernel.lua @@ -0,0 +1,42 @@ +local properties = node.get_properties_table() +local if_vertical = token.create'ifv@' +local if_horizontal = token.create'ifh@' +local iftrue_index = token.create'iftrue'.index + +local funcid = luatexbase.new_luafunction'__luamml_kernel_finalize_phantom:N' +token.set_lua('__luamml_kernel_finalize_phantom:N', funcid, 'protected') +lua.get_functions_table()[funcid] = function() + -- TODO: Error handling etc + -- At this point, box 0 contains the inner expression and the curent list ends with the noad whose nucleus should get replaced + local size = token.scan_int()//2 + local boxnum = 0 + local startmath = tex.box[boxnum].list + assert(startmath.id == node.id"math") + local nucl = assert(tex.nest.top.tail.nucleus) + local props = properties[nucl] + if not props then -- very likely + props = {} + properties[nucl] = props + end + assert(not props.mathml_table) + local saved = assert(assert(properties[startmath]).saved_mathml_table) + if saved[0] == 'mstyle' + and (not saved.displaystyle or saved.displaystyle == (size == 0)) + and (not saved.scriptlevel or saved.scriptlevel == (size == 0 and 0 or size-1)) + then + saved[0], saved.displaystyle, saved.scriptlevel = 'mphantom', nil, nil + elseif saved[0] == 'mrow' then + saved[0] = 'mphantom' + else + saved = {[0] = 'mphantom', saved} + end + -- The following could be optimized for the case that both if_vertical and if_horizontal + -- are set, but that should't happen ayway and is just supported for consistency. + if if_vertical.index ~= iftrue_index then + saved = {[0] = 'mpadded', height = 0, depth = 0, saved} + end + if if_horizontal.index ~= iftrue_index then + saved = {[0] = 'mpadded', width = 0, saved} + end + props.mathml_table = saved +end diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty new file mode 100644 index 0000000..21236cc --- /dev/null +++ b/luamml-patches-kernel.sty @@ -0,0 +1,16 @@ +\ProvidesExplPackage {luamml-patches-kernel} {2021-05-30} {0.0.1-alpha} + {Feel free to add a description here} + +\lua_now:n { require'luamml-kernel' } + +\cs_set:Npn \mathph@nt #1 #2 { + \hbox_set:Nn \c_zero_int { + $ + \m@th + #1 + {#2} + $ + } + \finph@nt + \__luamml_kernel_finalize_phantom:N #1 +} diff --git a/luamml.sty b/luamml.sty index c14f68e..f3dec3d 100644 --- a/luamml.sty +++ b/luamml.sty @@ -35,5 +35,6 @@ \RequirePackage { luamml-patches-#1 } } } +\RequirePackage { luamml-patches-kernel } \__luamml_patch_package:n {amsmath} \__luamml_patch_package:n {array} From db605801916d3145ff642717d96250d1ac339d5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 31 May 2021 01:54:21 +0200 Subject: [PATCH 022/206] Preserve core for user provided nodes --- luamml-convert.lua | 26 +++++++++++++++----------- luamml-kernel.lua | 6 ++++-- luamml-lr.lua | 2 +- luamml-patches-kernel.sty | 1 + luamml-table.lua | 2 +- luamml-tex.lua | 4 ++-- 6 files changed, 24 insertions(+), 17 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index 2dfa8b0..97161bf 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -104,8 +104,8 @@ local digit_map = {["0"] = true, ["1"] = true, ["5"] = true, ["6"] = true, ["7"] = true, ["8"] = true, ["9"] = true,} --- Two marker tables. They are used instead of an embellished operator to mark space-like or user provided constructs -local user_provided, space_like = {}, {} +-- Marker tables replacing the core operator for space like elements +local space_like = {} local nodes_to_table @@ -114,7 +114,7 @@ local function sup_style(s) return s//4*2+4+s%2 end -- The _to_table functions generally return a second argument which is -- could be (if it were a ) a core operator of the embellishe operator --- or space_like/user_provided +-- or space_like -- acc_to_table is special since it's return value should -- always be considered a core operator @@ -122,8 +122,9 @@ local function sup_style(s) return s//4*2+4+s%2 end local function delim_to_table(delim) if not delim then return end local props = properties[delim] - local mathml_table = props and props.mathml_table - if mathml_table then return mathml_table end + local mathml_core = props and props.mathml_core + local mathml_table = props and (props.mathml_table or mathml_core) + if mathml_table then return mathml_table, mathml_core end local mathml_filter = props and props.mathml_filter -- Kind of pointless since the arguments are literals, but present for consistency local char = delim.small_char if char == 0 then @@ -150,8 +151,9 @@ end local function acc_to_table(acc, cur_style, stretch) if not acc then return end local props = properties[acc] - local mathml_table = props and props.mathml_table - if mathml_table then return mathml_table end + local mathml_core = props and props.mathml_core + local mathml_table = props and (props.mathml_table or mathml_core) + if mathml_table then return mathml_table, mathml_core end if acc.id ~= math_char_t then error'confusion' end @@ -173,8 +175,9 @@ end local function kernel_to_table(kernel, cur_style) if not kernel then return end local props = properties[kernel] - local mathml_table = props and props.mathml_table - if mathml_table then return mathml_table, user_provided end + local mathml_core = props and props.mathml_core + local mathml_table = props and (props.mathml_table or mathml_core) + if mathml_table then return mathml_table, mathml_core end local mathml_filter = props and props.mathml_filter -- Kind of pointless since the arguments are literals, but present for consistency local id = kernel.id if id == math_char_t then @@ -500,9 +503,10 @@ function nodes_to_table(head, cur_style) for n, id, sub in node.traverse(head) do local new_core, new_mn, new_node, new_noad local props = properties[n] - local mathml_table = props and props.mathml_table + local mathml_core = props and props.mathml_core + local mathml_table = props and (props.mathml_table or mathml_core) if mathml_table then - new_node, new_core = mathml_table, user_provided + new_node, new_core = mathml_table, mathml_core elseif id == noad_t then local new_n new_n, new_core, new_mn = noad_to_table(n, sub, cur_style, mn) diff --git a/luamml-kernel.lua b/luamml-kernel.lua index f326ce9..65b3efa 100644 --- a/luamml-kernel.lua +++ b/luamml-kernel.lua @@ -19,7 +19,9 @@ lua.get_functions_table()[funcid] = function() properties[nucl] = props end assert(not props.mathml_table) - local saved = assert(assert(properties[startmath]).saved_mathml_table) + local saved_props = assert(properties[startmath]) + local saved_core = saved_props.saved_mathml_core + local saved = assert(saved_props.saved_mathml_table or saved_core) if saved[0] == 'mstyle' and (not saved.displaystyle or saved.displaystyle == (size == 0)) and (not saved.scriptlevel or saved.scriptlevel == (size == 0 and 0 or size-1)) @@ -38,5 +40,5 @@ lua.get_functions_table()[funcid] = function() if if_horizontal.index ~= iftrue_index then saved = {[0] = 'mpadded', width = 0, saved} end - props.mathml_table = saved + props.mathml_table, props.mathml_core = saved, saved_core end diff --git a/luamml-lr.lua b/luamml-lr.lua index b1cb359..d0cbc55 100644 --- a/luamml-lr.lua +++ b/luamml-lr.lua @@ -36,7 +36,7 @@ local function to_unicode(head, tail) end elseif node.id'math' == id then if props then - local mml = props.saved_mathml_table + local mml = props.saved_mathml_table or props.saved_mathml_core if mml then if i ~= 0 then result[#result+1] = {[0] = 'mtext', table.concat(subresult)} diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index 21236cc..5326917 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -9,6 +9,7 @@ \m@th #1 {#2} + \luamml_flag_save: $ } \finph@nt diff --git a/luamml-table.lua b/luamml-table.lua index f4ab238..340fb06 100644 --- a/luamml-table.lua +++ b/luamml-table.lua @@ -35,7 +35,7 @@ end local function store_column(startmath, display) local props = properties[startmath] if not props then return end - local mml = props.saved_mathml_table + local mml = props.saved_mathml_table or props.saved_mathml_core if mml then return store_column_xml(mml, display) end end diff --git a/luamml-tex.lua b/luamml-tex.lua index f8d4b03..4febba1 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -86,7 +86,7 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) else new_mlist = mlist end - local xml = process_mlist(new_mlist, style == 'display' and 0 or 2) + local xml, core = process_mlist(new_mlist, style == 'display' and 0 or 2) if flag & 2 == 0 then save_result(xml, style == 'display' or flag & 1 == 1) end @@ -100,7 +100,7 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) props = {} properties[startmath] = props end - props.saved_mathml_table = xml + props.saved_mathml_table, props.saved_mathml_core = xml, core end if buffer_tail then mlist.prev, buffer_tail.next = nil, nil From a0dc11d37df3db4be64be1a258c69e449b9a8faf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 31 May 2021 12:42:51 +0200 Subject: [PATCH 023/206] Rename and rewrite pdfTeX stuff --- .gitignore | 5 + emulated_nodes.lua => pdfmml-emulate-node.lua | 0 pdfmml-logreader.lua | 26 +++ parse_showlists.lua => pdfmml-showlists.lua | 0 showlists_test.lua | 180 ++---------------- 5 files changed, 45 insertions(+), 166 deletions(-) create mode 100644 .gitignore rename emulated_nodes.lua => pdfmml-emulate-node.lua (100%) create mode 100644 pdfmml-logreader.lua rename parse_showlists.lua => pdfmml-showlists.lua (100%) mode change 100644 => 100755 showlists_test.lua diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..19c2c43 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/build/ +*.aux +*.log +*.pdf +*.xml diff --git a/emulated_nodes.lua b/pdfmml-emulate-node.lua similarity index 100% rename from emulated_nodes.lua rename to pdfmml-emulate-node.lua diff --git a/pdfmml-logreader.lua b/pdfmml-logreader.lua new file mode 100644 index 0000000..d211d56 --- /dev/null +++ b/pdfmml-logreader.lua @@ -0,0 +1,26 @@ +local l = lpeg or require'lpeg' + +local line = (1-l.P'\n')^0 * '\n' + +local list_block = (l.C(l.S'\\._^/ps' * (1-l.P'\n')^0)^-1 * '\n')^0 +local math_lists_block = l.Ct('### ' * l.Cg(l.C'display' * ' ', 'display')^-1 * 'math mode entered at line ' * l.Cg(l.R'09'^1 / tonumber, 'line') * '\n' + * list_block)^1 +local generic_list_block = '### ' * line * list_block +local luamml_block = l.Ct('LUAMML_META_BEGIN\n\n' + * (math_lists_block + generic_list_block/0)^0 + * (line - 'LUAMML_META_END\n')^0 + * 'LUAMML_META_END\n') +local log_file = l.Ct((luamml_block + line)^0) + +return function(filename) + local f + if filename and filename ~= '-' then + local msg f, msg = assert(io.open(filename, 'r')) + if not f then return f, msg end + end + local content = (f or io.stdin):read'a' + if f then f:close() end + -- The following does *not* end with * -1 since we want to allow the last line to not end with \n. + -- In that case we ignore the last line, but that's safe since the last line never contains our markers. + return assert(log_file:match(content)) +end diff --git a/parse_showlists.lua b/pdfmml-showlists.lua similarity index 100% rename from parse_showlists.lua rename to pdfmml-showlists.lua diff --git a/showlists_test.lua b/showlists_test.lua old mode 100644 new mode 100755 index 5c25b00..d5849a3 --- a/showlists_test.lua +++ b/showlists_test.lua @@ -1,4 +1,5 @@ -require'emulated_nodes' +#!/usr/bin/env texlua +require'pdfmml-emulate-node' local convert = require'luamml-convert' local mappings = require'luamml-legacy-mappings' local to_xml = require'luamml-xmlwriter' @@ -6,175 +7,22 @@ convert.register_family(1, mappings.oml) convert.register_family(2, mappings.oms) convert.register_family(3, mappings.omx) -local parse_showlists = require'parse_showlists' -local l = lpeg or require'lpeg' +local parse_showlists = require'pdfmml-showlists' +local parse_log = require'pdfmml-logreader' -local line = (1-l.P'\n')^0 * '\n' -local Cline = l.C((1-l.P'\n')^0) * '\n' - -local list_block = (l.C(l.S'\\._^/ps' * (1-l.P'\n')^0)^-1 * '\n')^0 -local math_lists_block = l.Ct('### ' * l.Cg(l.C'display' * ' ', 'display')^-1 * 'math mode entered at line ' * l.Cg(l.R'09'^1 / tonumber, 'line') * '\n' - * list_block)^1 -local generic_list_block = '### ' * line * list_block -local luamml_block = l.Ct('LUAMML_META_BEGIN\n\n' - * (math_lists_block + generic_list_block/0)^0 - * (line - 'LUAMML_META_END\n')^0 - * 'LUAMML_META_END\n') - -local math_lists = (function() - local f = assert(io.open(arg[1], 'r')) - local content = f:read'a' - f:close() - -- The following does *not* end with * -1 since we want to allow the last line to not end with \n. - -- In that case we ignore the last line, but that's safe since the last line never contains our markers. - local log_file = l.Ct((luamml_block + line)^0) - return log_file:match(content) -end)() -local lines = l.Ct((l.C((1-l.P'\n')^0) * '\n')^0 * l.C(l.P(1)^1)^-1):match( -[[\mathinner -.\left"28300 -.\mathord -..\fraction, thickness 0.0, left-delimiter "28300, right-delimiter "29301 -..\\mathord -..\.\fam0 1 -../\mathord -../.\fam0 1 -.\mathord -..\fam1 x -._\mathord -._.\fam0 1 -._\mathord -._.\fam1 = -._\mathord -._.\fam0 2 -.\mathchoice -.D\mathord -.D.\fam1 d -.D\mathord -.D.\fam1 i -.D\mathord -.D.\fam1 s -.D\mathord -.D.\fam1 p -.D\mathord -.D.\fam1 l -.D\mathord -.D.\fam1 a -.D\mathord -.D.\fam1 y -.D\scriptstyle -.D\mathord -.D.\fam1 a -.D\mathord -.D.\fam1 b -.D\mathord -.D.\fam1 c -.T\mathord -.T.\fam1 t -.T\mathord -.T.\fam1 e -.T\mathord -.T.\fam1 x -.T\mathord -.T.\fam1 t -.T\scriptscriptstyle -.T\mathord -.T.\fam1 a -.T\mathord -.T.\fam1 b -.T\mathord -.T.\fam1 c -.S\mathord -.S.\fam1 s -.S\mathord -.S.\fam1 c -.S\mathord -.S.\fam1 r -.S\mathord -.S.\fam1 i -.S\mathord -.S.\fam1 p -.S\mathord -.S.\fam1 t -.S\textstyle -.S\mathord -.S.\fam1 a -.S\mathord -.S.\fam1 b -.S\mathord -.S.\fam1 c -.s\mathord -.s.\fam1 s -.s\mathord -.s.\fam1 c -.s\mathord -.s.\fam1 r -.s\mathord -.s.\fam1 i -.s\mathord -.s.\fam1 p -.s\mathord -.s.\fam1 t -.s\mathord -.s.\fam1 s -.s\mathord -.s.\fam1 c -.s\mathord -.s.\fam1 r -.s\mathord -.s.\fam1 i -.s\mathord -.s.\fam1 p -.s\mathord -.s.\fam1 t -.s\displaystyle -.s\mathord -.s.\fam1 a -.s\mathord -.s.\fam1 b -.s\mathord -.s.\fam1 c -.\mathbin -..\fam0 + -.\accent\fam0 _ -..\fam1 z -._\fam0 0 -.\right"29301 -\mathrel -.\fam0 = -\mathop\nolimits -.\fam3 P -^\fam0 1 -_\mathord -_.\fam1 i -_\mathrel -_.\fam0 = -_\mathord -_.\fam0 1 -\mathord -.\fraction, thickness = default -.\\mathbin -.\.\fam2 ^^@ -.\\mathord -.\.\fam1 p -.\\mathbin -.\.\fam2 ^^F -.\\radical"270370 -.\.\mathord -.\..\fam1 p -.\.\mathbin -.\..\fam2 ^^@ -.\.\mathord -.\..\fam0 4 -.\.\mathord -.\..\fam1 q -./\mathord -./.\fam0 2 -]]) +if #arg < 1 then + io.stderr:write(string.format('Usage: %0 {logname} \n', arg[0])) + os.exit(1) +end +local math_lists = assert(parse_log(arg[1])) +local out_stream = arg[2] and arg[2] ~= '-' and assert(io.open(arg[2], 'w')) or io.stdout for i, block in ipairs(math_lists) do block = block[1] local parsed = parse_showlists(block) local style = block.display and 0 or 2 - print(to_xml(convert.make_root(convert.process(parsed, style), style))) + out_stream:write( + to_xml(convert.make_root(convert.process(parsed, style), style)) + ) end +-- if ... then out_stream:close() end -- Don't bother since we terminate anyway From 06915c6aa3096e7c072f8ad01310ac904a38f37f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 31 May 2021 13:25:08 +0200 Subject: [PATCH 024/206] Mathlists (m)kern support --- pdfmml-showlists.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pdfmml-showlists.lua b/pdfmml-showlists.lua index 321aa6d..1338946 100644 --- a/pdfmml-showlists.lua +++ b/pdfmml-showlists.lua @@ -6,7 +6,7 @@ local tex_char = l.Cg('^^' * (hex_digit * hex_digit / hex_to_int + l.R'\x40\x7F' / function(s) return s:byte() - 0x40 end) + l.P(1) / string.byte) -local scaled = l.R'09'^1 * '.' * l.R'09'^1 / function(s) return (tonumber(s * 0x10000) + .5) // 1 end +local scaled = l.P'-'^-1 * l.R'09'^1 * '.' * l.R'09'^1 / function(s) return (tonumber(s * 0x10000) + .5) // 1 end local delimiter_code = '"' * (l.R('09', 'AF')^1 / function(s) local code = tonumber(s, 16) return {id = 'delim', @@ -48,6 +48,8 @@ local simple_noad = l.Ct( + 'text' * l.Cc(2) + 'scriptscript' * l.Cc(6) + 'script' * l.Cc(4), 'subtype') * l.Cg('style', 'id') + + '\\mkern' * l.Cg(scaled, 'kern') * 'mu' * l.Cg(l.Cc(99), 'subtype') * l.Cg(l.Cc'kern', 'id') + + '\\kern' * l.Cg(' ' * l.Cc(1) + l.Cc(0), 'subtype') * l.Cg(scaled, 'kern') * (' (for ' * (l.R'az' + l.S'/\\') * ')')^-1 * l.Cg(l.Cc'kern', 'id') ) * -1 local fraction_noad = l.Ct('\\fraction, thickness ' From a782003db440690017ab1491bb47465187b4121c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 1 Jun 2021 22:28:27 +0200 Subject: [PATCH 025/206] Allow properties to suppress nodes --- luamml-convert.lua | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index 97161bf..380865c 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -124,7 +124,7 @@ local function delim_to_table(delim) local props = properties[delim] local mathml_core = props and props.mathml_core local mathml_table = props and (props.mathml_table or mathml_core) - if mathml_table then return mathml_table, mathml_core end + if mathml_table ~= nil then return mathml_table, mathml_core end local mathml_filter = props and props.mathml_filter -- Kind of pointless since the arguments are literals, but present for consistency local char = delim.small_char if char == 0 then @@ -153,7 +153,7 @@ local function acc_to_table(acc, cur_style, stretch) local props = properties[acc] local mathml_core = props and props.mathml_core local mathml_table = props and (props.mathml_table or mathml_core) - if mathml_table then return mathml_table, mathml_core end + if mathml_table ~= nil then return mathml_table, mathml_core end if acc.id ~= math_char_t then error'confusion' end @@ -177,7 +177,7 @@ local function kernel_to_table(kernel, cur_style) local props = properties[kernel] local mathml_core = props and props.mathml_core local mathml_table = props and (props.mathml_table or mathml_core) - if mathml_table then return mathml_table, mathml_core end + if mathml_table ~= nil then return mathml_table, mathml_core end local mathml_filter = props and props.mathml_filter -- Kind of pointless since the arguments are literals, but present for consistency local id = kernel.id if id == math_char_t then @@ -505,7 +505,8 @@ function nodes_to_table(head, cur_style) local props = properties[n] local mathml_core = props and props.mathml_core local mathml_table = props and (props.mathml_table or mathml_core) - if mathml_table then + print(mathml_table) + if mathml_table ~= nil then new_node, new_core = mathml_table, mathml_core elseif id == noad_t then local new_n From d6b2747171cae4402a0482a4d3bd0f77e0356a08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 1 Jun 2021 22:29:48 +0200 Subject: [PATCH 026/206] Support annotations while parsing pdfTeX log --- luamml-convert.lua | 1 - luamml-pdf.sty | 94 ++++++++++++++++++++++++++++++++ pdfmml-logreader.lua | 24 +++++--- pdfmml-showlists.lua | 37 +++++++++++-- showlists_test.lua => pdfmml.lua | 4 +- 5 files changed, 144 insertions(+), 16 deletions(-) create mode 100644 luamml-pdf.sty rename showlists_test.lua => pdfmml.lua (88%) diff --git a/luamml-convert.lua b/luamml-convert.lua index 380865c..79b7994 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -505,7 +505,6 @@ function nodes_to_table(head, cur_style) local props = properties[n] local mathml_core = props and props.mathml_core local mathml_table = props and (props.mathml_table or mathml_core) - print(mathml_table) if mathml_table ~= nil then new_node, new_core = mathml_table, mathml_core elseif id == noad_t then diff --git a/luamml-pdf.sty b/luamml-pdf.sty new file mode 100644 index 0000000..7f1d751 --- /dev/null +++ b/luamml-pdf.sty @@ -0,0 +1,94 @@ +\ProvidesExplPackage {luamml-pdf} {2021-05-31} {0.0.1-alpha} + {MathML generation for LฬถuฬถaฬถpdfLaTeX} + +\cs_new:Npn \__luamml_pdf_showlists: { + \group_begin: + \int_set:Nn \l_tmpa_int { \tex_interactionmode:D } + \int_set:Nn \tex_interactionmode:D { 0 } + \int_set:Nn \tex_showboxdepth:D { \c_max_int } + \int_set:Nn \tex_showboxbreadth:D { \c_max_int } + \tex_showlists:D + \int_set:Nn \tex_interactionmode:D { \l_tmpa_int } + \group_end: +} + +\int_new:N \g__luamml_formula_id_int +\cs_new_protected:Npn \luamml_pdf_write: { + \int_gincr:N \g__luamml_formula_id_int + \iow_log:x { + LUAMML_FORMULA_BEGIN: + \int_use:N \g__luamml_formula_id_int + } + \__luamml_pdf_showlists: + \iow_log:x { + LUAMML_FORMULA_END + } +} + +\cs_new:Npn \luamml_pdf_last_formula: { + \int_use:N \g__luamml_formula_id_int +} + +\cs_generate_variant:Nn \tl_to_str:n { e } + +% annotate parameters +% #1 number of top level nodes to be annotated +% #2 annotation +% #3 nodes to be annotated +\int_new:N \g__luamml_annotation_id_int +\cs_new_protected:Npn \luamml_pdf_annotate:nnn #1#2#3 { + \int_gincr:N \g__luamml_annotation_id_int + \iow_shipout_x:Nx \c_log_iow { + \tl_to_str:e { + LUAMML_MARK: + \int_use:N \g__luamml_annotation_id_int + : + count = \int_eval:n {#1}, + #2 + } + \exp_not:N \iow_newline: + LUAMML_MARK_END + } + #3 +} + +% annotate parameters +% #1 annotation +% #2 nodes to be annotated +% THIS VERSION IS SIGNIFICANTLY SLOWER +\cs_new_protected:Npn \luamml_pdf_annotate:nn #1#2 { + \int_gincr:N \g__luamml_annotation_id_int + \iow_write:Nx \c_log_iow { + LUAMML_COUNT_BEGIN: + \int_use:N \g__luamml_annotation_id_int + } + \__luamml_pdf_showlists: + \iow_shipout:Nx \c_log_iow { + LUAMML_MARK: + \int_use:N \g__luamml_annotation_id_int + : + #1 + } + #2 + \iow_write:Nx \c_log_iow { + LUAMML_COUNT_END: + \int_use:N \g__luamml_annotation_id_int + } + \__luamml_pdf_showlists: +} + +\endinput + +\cs_new:Npn \__luamml_patch_package:nn #1 #2 { + \@ifpackageloaded {#1} {#2} { + \hook_gput_code:nnn {package/after/#1} {luamml} {#2} + } +} +\cs_new:Npn \__luamml_patch_package:n #1 { + \__luamml_patch_package:nn {#1} { + \RequirePackage { luamml-patches-#1 } + } +} +\RequirePackage { luamml-patches-kernel } +\__luamml_patch_package:n {amsmath} +\__luamml_patch_package:n {array} diff --git a/pdfmml-logreader.lua b/pdfmml-logreader.lua index d211d56..384345a 100644 --- a/pdfmml-logreader.lua +++ b/pdfmml-logreader.lua @@ -2,15 +2,23 @@ local l = lpeg or require'lpeg' local line = (1-l.P'\n')^0 * '\n' -local list_block = (l.C(l.S'\\._^/ps' * (1-l.P'\n')^0)^-1 * '\n')^0 +local id = l.R'09'/tonumber +local non_final_list_block = (l.C((1-l.P'\n')^0) * '\n' - '### ')^0 local math_lists_block = l.Ct('### ' * l.Cg(l.C'display' * ' ', 'display')^-1 * 'math mode entered at line ' * l.Cg(l.R'09'^1 / tonumber, 'line') * '\n' - * list_block)^1 -local generic_list_block = '### ' * line * list_block -local luamml_block = l.Ct('LUAMML_META_BEGIN\n\n' - * (math_lists_block + generic_list_block/0)^0 - * (line - 'LUAMML_META_END\n')^0 - * 'LUAMML_META_END\n') -local log_file = l.Ct((luamml_block + line)^0) + * non_final_list_block)^1 +local generic_list_block = '### ' * (line - 'current page:') * non_final_list_block +local luamml_block = l.Cg('LUAMML_FORMULA_BEGIN:' * id * l.P'\n'^1 * l.Ct( + (math_lists_block + generic_list_block/0)^0 + * (line - 'LUAMML_FORMULA_END\n')^0 + * 'LUAMML_FORMULA_END\n') * l.Cc'groups') + +local luamml_mark = l.Cg('LUAMML_MARK:' * id * ':' * l.Cs((1 - l.P'\n' + l.Cg('\n' * l.Cc'' - '\nLUAMML_MARK_END\n'))^0) * '\nLUAMML_MARK_END\n' * l.Cc'marks') + +local function multi_table_set(t, key, value, table) + assert(t[table])[key] = value + return t +end +local log_file = l.Cf(l.Ct(l.Cg(l.Ct'', 'groups') * l.Cg(l.Ct'', 'marks')) * (luamml_block + luamml_mark + line)^0, multi_table_set) return function(filename) local f diff --git a/pdfmml-showlists.lua b/pdfmml-showlists.lua index 1338946..012046a 100644 --- a/pdfmml-showlists.lua +++ b/pdfmml-showlists.lua @@ -1,3 +1,7 @@ +require'pdfmml-emulate-node' + +local properties = node.get_properties_table() + local l = lpeg or require'lpeg' local hex_digit = l.R('09', 'af') local function hex_to_int(s) return tonumber(s, 16) end @@ -22,12 +26,12 @@ local math_char = l.Ct('\\fam' * l.Cg(l.R'09'^1 / tonumber, 'fam') * ' ' * l.Cg( local simple_noad = l.Ct( '\\math' * l.Cg( 'ord' * l.Cc(0) + + 'open' * l.Cc(6) + 'op\\limits' * l.Cc(2) + 'op\\nolimits' * l.Cc(3) + 'op' * l.Cc(1) + 'bin' * l.Cc(4) + 'rel' * l.Cc(5) - + 'open' * l.Cc(6) + 'close' * l.Cc(7) + 'punct' * l.Cc(8) + 'inner' * l.Cc(9) @@ -60,6 +64,8 @@ local fraction_noad = l.Ct('\\fraction, thickness ' local mathchoice_noad = l.Ct('\\mathchoice' * l.Cg(l.Cc'choice', 'id') * -1) +local mark_whatsit = '\\write-{LUAMML_MARK:' * (l.R'09'/tonumber) * ':' + local parse_list local function parse_kernel(lines, i, prefix) local line = lines[i] @@ -69,11 +75,14 @@ local function parse_kernel(lines, i, prefix) result, i = parse_list(lines, i, prefix) return {list = result, id = 'sub_mlist'}, i end -function parse_list(lines, i, prefix) +function parse_list(lines, i, prefix, marks) i = i or 1 prefix = prefix or '' local head, last + local mark_environment = {} + local current_mark, current_count, current_offset while true do + local skip local line = lines[i] if not line or line:sub(1, #prefix) ~= prefix then break end local simple = simple_noad:match(line, #prefix+1) @@ -106,13 +115,31 @@ function parse_list(lines, i, prefix) end last = mathchoice else - print(line, prefix, i) - print('unknown noad ' .. line:sub(#prefix+1)) - i = i + 1 + skip = true + local mark = mark_whatsit:match(line) + if mark then + local mark_table = assert(load('return {' .. assert(marks[mark], 'Undefined mark encountered') .. '}', nil, 't', mark_environment))() + current_mark, current_count, current_offset = mark_table, mark_table.count or 1, mark_table.offset or 1 + i = i + 1 + else + print(line, prefix, i) + print('unknown noad ' .. line:sub(#prefix+1)) + i = i + 1 + end end end end if not head then head = last end + if not skip and current_mark then + current_count = current_count - 1 + current_offset = current_offset - 1 + if current_offset == 0 then + properties[current_mark.nucleus and last.nucleus or last] = {mathml_core = current_mark.core} + else + properties[last] = {mathml_core = false} + end + if current_count == 0 then current_mark = nil end + end end return head, i end diff --git a/showlists_test.lua b/pdfmml.lua similarity index 88% rename from showlists_test.lua rename to pdfmml.lua index d5849a3..bf20c51 100755 --- a/showlists_test.lua +++ b/pdfmml.lua @@ -17,9 +17,9 @@ end local math_lists = assert(parse_log(arg[1])) local out_stream = arg[2] and arg[2] ~= '-' and assert(io.open(arg[2], 'w')) or io.stdout -for i, block in ipairs(math_lists) do +for i, block in ipairs(math_lists.groups) do block = block[1] - local parsed = parse_showlists(block) + local parsed = parse_showlists(block, nil, nil, math_lists.marks) local style = block.display and 0 or 2 out_stream:write( to_xml(convert.make_root(convert.process(parsed, style), style)) From dd7098fb4a092d88c51dbfa7b7268f9102a70d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 1 Jun 2021 23:00:21 +0200 Subject: [PATCH 027/206] Add pdfmml sample --- test_pdf.tex | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 test_pdf.tex diff --git a/test_pdf.tex b/test_pdf.tex new file mode 100644 index 0000000..22dfe3b --- /dev/null +++ b/test_pdf.tex @@ -0,0 +1,34 @@ +\documentclass{article} +\usepackage{luamml-pdf} + +% \RegisterFamilyMapping\symsymbols{oms} +% \RegisterFamilyMapping\symletters{oml} +% \RegisterFamilyMapping\symlargesymbols{omx} + +\ExplSyntaxOn +\cs_set_eq:NN \WriteoutFormula \luamml_pdf_write: +\NewDocumentCommand\AnnotateFormula{ o m m }{% + \IfValueTF{#1}{% + \luamml_pdf_annotate:nnn{#1}% + }{ + \luamml_pdf_annotate:nn + }{#2}{#3} +} +\ExplSyntaxOff + +\begin{document} +\[ + \emptyset\models((p\Rightarrow q)\Rightarrow(q\Rightarrow r))\Rightarrow (p\Rightarrow (q\Rightarrow r)) + \WriteoutFormula +\] + +%\begin{align} +% abc&=def & e^{\mathrm{i}\pi}&=-1\\ +% \Big(1+2&=3\Big)\\ +% &4\\ +% 5 +%\end{align} + +Es gilt $\sin(x)-\sin(x+2\pi)=0\WriteoutFormula$. +\end{document} + From 06149a5e99d31f8d4b885aeb6e8ef2f2e7cfc21e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 1 Jun 2021 23:17:29 +0200 Subject: [PATCH 028/206] Annotate \models --- pdfmml.lua | 2 +- test_pdf.tex | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pdfmml.lua b/pdfmml.lua index bf20c51..5997956 100755 --- a/pdfmml.lua +++ b/pdfmml.lua @@ -22,7 +22,7 @@ for i, block in ipairs(math_lists.groups) do local parsed = parse_showlists(block, nil, nil, math_lists.marks) local style = block.display and 0 or 2 out_stream:write( - to_xml(convert.make_root(convert.process(parsed, style), style)) + to_xml(convert.make_root(convert.process(parsed, style), style)), '\n' ) end -- if ... then out_stream:close() end -- Don't bother since we terminate anyway diff --git a/test_pdf.tex b/test_pdf.tex index 22dfe3b..5d14c49 100644 --- a/test_pdf.tex +++ b/test_pdf.tex @@ -16,6 +16,10 @@ } \ExplSyntaxOff +\protected\edef\models{\AnnotateFormula[3]{% + nucleus = true, core = {[0] = 'mi', '\noexpand\string\noexpand\u{22a7}'}, + }{\unexpanded\expandafter{\models}}} + \begin{document} \[ \emptyset\models((p\Rightarrow q)\Rightarrow(q\Rightarrow r))\Rightarrow (p\Rightarrow (q\Rightarrow r)) From 9d76be873e9f06733601bf56c9ea29858d0d2d58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 1 Jun 2021 23:36:41 +0200 Subject: [PATCH 029/206] Update README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 254df05..2b14b51 100644 --- a/README.md +++ b/README.md @@ -12,3 +12,5 @@ Run `lualatex test_tex` to see all equations from [our example file](./test_tex. To test it on your own files, add `\usepackage{luamml}` and `\tracingmathml=2` to your preamble. Also see a [`tagpdf` experiment using this to tag PDF formulas](https://github.com/u-fischer/tagpdf/blob/develop/experiments/exp-mathml-lua.tex). + +If you are very brave you can also try running `pdflatex test_pdf` and afterwards run `./pdfmml.lua test_pdf.lua` to get pdflatex formulas converted. From 29bda8e8c26651254677d9aae946113ad2781751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 2 Jun 2021 21:14:10 +0200 Subject: [PATCH 030/206] Improve pdfmml.lua interface --- pdfmml.lua | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/pdfmml.lua b/pdfmml.lua index 5997956..58f509b 100755 --- a/pdfmml.lua +++ b/pdfmml.lua @@ -3,6 +3,7 @@ require'pdfmml-emulate-node' local convert = require'luamml-convert' local mappings = require'luamml-legacy-mappings' local to_xml = require'luamml-xmlwriter' + convert.register_family(1, mappings.oml) convert.register_family(2, mappings.oms) convert.register_family(3, mappings.omx) @@ -10,19 +11,44 @@ convert.register_family(3, mappings.omx) local parse_showlists = require'pdfmml-showlists' local parse_log = require'pdfmml-logreader' +local attributes = lfs.attributes +local function try_extensions_(base, extension, ...) + if extension == nil then return end + local fullname = base .. extension + if attributes(fullname, 'mode') == 'file' then + return fullname + end + return try_extensions_(base, ...) +end +local function try_extensions(base, ...) + if attributes(base, 'mode') == 'file' then return base end + return try_extensions_(base, ...) +end + if #arg < 1 then - io.stderr:write(string.format('Usage: %0 {logname} \n', arg[0])) + io.stderr:write(string.format('Usage: %s {logname} [{outname}]\n\z + If {outname} includes {}, then a separate file is written for every formula with {} replaced by the formula id.\n', arg[0])) os.exit(1) end -local math_lists = assert(parse_log(arg[1])) +local math_lists = assert(parse_log(assert(try_extensions(arg[1], '.tml', '.log'), + "Couldn't find input file."))) -local out_stream = arg[2] and arg[2] ~= '-' and assert(io.open(arg[2], 'w')) or io.stdout +local out_prefix, out_suffix, out_stream +if not arg[2] or arg[2] == '-' then + out_stream = io.stdout +else + local _ _, _, out_prefix, out_suffix = arg[2]:find'^(.*){}(.*)$' + if not out_prefix then + out_stream = assert(io.open(arg[2], 'w')) + end +end for i, block in ipairs(math_lists.groups) do + local stream = out_stream or assert(io.open(out_prefix .. tostring(i) .. out_suffix, 'w')) block = block[1] local parsed = parse_showlists(block, nil, nil, math_lists.marks) local style = block.display and 0 or 2 - out_stream:write( + stream:write( to_xml(convert.make_root(convert.process(parsed, style), style)), '\n' ) + if not out_stream then stream:close() end end --- if ... then out_stream:close() end -- Don't bother since we terminate anyway From e7eb77a396781b559566d894ea10bd4ba5f0d6f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 2 Jun 2021 21:15:37 +0200 Subject: [PATCH 031/206] Offset in pdf mode should default to last node Otherwise superscript/subscripts don't work correctly --- pdfmml-showlists.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pdfmml-showlists.lua b/pdfmml-showlists.lua index 012046a..af7f191 100644 --- a/pdfmml-showlists.lua +++ b/pdfmml-showlists.lua @@ -119,7 +119,8 @@ function parse_list(lines, i, prefix, marks) local mark = mark_whatsit:match(line) if mark then local mark_table = assert(load('return {' .. assert(marks[mark], 'Undefined mark encountered') .. '}', nil, 't', mark_environment))() - current_mark, current_count, current_offset = mark_table, mark_table.count or 1, mark_table.offset or 1 + current_mark, current_count = mark_table, mark_table.count or 1 + current_offset = mark_table.offset or current_count i = i + 1 else print(line, prefix, i) From 6da728c217b0d172361ef906ff381e9b2ef17daa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 3 Jun 2021 17:06:01 +0200 Subject: [PATCH 032/206] Make family mappings configurable in pdfTeX --- luamml-pdf.sty | 6 ++++++ pdfmml-logreader.lua | 11 +++++++++-- pdfmml.lua | 24 +++++++++++++++++------- test_pdf.tex | 6 +++--- 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/luamml-pdf.sty b/luamml-pdf.sty index 7f1d751..0e2419d 100644 --- a/luamml-pdf.sty +++ b/luamml-pdf.sty @@ -77,6 +77,12 @@ \__luamml_pdf_showlists: } +\NewDocumentCommand \RegisterFamilyMapping {m m} { + \iow_log:x { + LUAMML_INSTRUCTION:REGISTER_MAPPING: \int_use:N #1 : #2 + } +} + \endinput \cs_new:Npn \__luamml_patch_package:nn #1 #2 { diff --git a/pdfmml-logreader.lua b/pdfmml-logreader.lua index 384345a..377f92d 100644 --- a/pdfmml-logreader.lua +++ b/pdfmml-logreader.lua @@ -14,11 +14,18 @@ local luamml_block = l.Cg('LUAMML_FORMULA_BEGIN:' * id * l.P'\n'^1 * l.Ct( local luamml_mark = l.Cg('LUAMML_MARK:' * id * ':' * l.Cs((1 - l.P'\n' + l.Cg('\n' * l.Cc'' - '\nLUAMML_MARK_END\n'))^0) * '\nLUAMML_MARK_END\n' * l.Cc'marks') +local luamml_instruction = l.Cg('LUAMML_INSTRUCTION:' * l.Cc(nil) * l.C((1 - l.P'\n')^0) * '\n' * l.Cc'instructions') + local function multi_table_set(t, key, value, table) - assert(t[table])[key] = value + table = t[table] + table[key or #table + 1] = value return t end -local log_file = l.Cf(l.Ct(l.Cg(l.Ct'', 'groups') * l.Cg(l.Ct'', 'marks')) * (luamml_block + luamml_mark + line)^0, multi_table_set) +local log_file = l.Cf(l.Ct(l.Cg(l.Ct'', 'groups') + * l.Cg(l.Ct'', 'marks') + * l.Cg(l.Ct'', 'instructions')) + * (luamml_block + luamml_mark + luamml_instruction + line)^0, + multi_table_set) return function(filename) local f diff --git a/pdfmml.lua b/pdfmml.lua index 58f509b..2b45dcb 100755 --- a/pdfmml.lua +++ b/pdfmml.lua @@ -4,10 +4,6 @@ local convert = require'luamml-convert' local mappings = require'luamml-legacy-mappings' local to_xml = require'luamml-xmlwriter' -convert.register_family(1, mappings.oml) -convert.register_family(2, mappings.oms) -convert.register_family(3, mappings.omx) - local parse_showlists = require'pdfmml-showlists' local parse_log = require'pdfmml-logreader' @@ -30,9 +26,23 @@ if #arg < 1 then If {outname} includes {}, then a separate file is written for every formula with {} replaced by the formula id.\n', arg[0])) os.exit(1) end -local math_lists = assert(parse_log(assert(try_extensions(arg[1], '.tml', '.log'), +local parsed = assert(parse_log(assert(try_extensions(arg[1], '.tml', '.log'), "Couldn't find input file."))) +for i, inst in ipairs(parsed.instructions) do + local _, _, family, mapping_name = inst:find'^REGISTER_MAPPING:([0-9]+):(.*)$' + if family then + local mapping = mappings[mapping_name] + if mapping then + convert.register_family(tonumber(family), mapping) + else + io.stderr:write(string.format('Unknown mapping %s ignored\n', mapping_name)) + end + else + io.stderr:write'Unknown instruction ignored\n' + end +end + local out_prefix, out_suffix, out_stream if not arg[2] or arg[2] == '-' then out_stream = io.stdout @@ -42,10 +52,10 @@ else out_stream = assert(io.open(arg[2], 'w')) end end -for i, block in ipairs(math_lists.groups) do +for i, block in ipairs(parsed.groups) do local stream = out_stream or assert(io.open(out_prefix .. tostring(i) .. out_suffix, 'w')) block = block[1] - local parsed = parse_showlists(block, nil, nil, math_lists.marks) + local parsed = parse_showlists(block, nil, nil, parsed.marks) local style = block.display and 0 or 2 stream:write( to_xml(convert.make_root(convert.process(parsed, style), style)), '\n' diff --git a/test_pdf.tex b/test_pdf.tex index 5d14c49..9b459f7 100644 --- a/test_pdf.tex +++ b/test_pdf.tex @@ -1,9 +1,9 @@ \documentclass{article} \usepackage{luamml-pdf} -% \RegisterFamilyMapping\symsymbols{oms} -% \RegisterFamilyMapping\symletters{oml} -% \RegisterFamilyMapping\symlargesymbols{omx} +\RegisterFamilyMapping\symsymbols{oms} +\RegisterFamilyMapping\symletters{oml} +\RegisterFamilyMapping\symlargesymbols{omx} \ExplSyntaxOn \cs_set_eq:NN \WriteoutFormula \luamml_pdf_write: From 5be2282e9b33f465fc249a531f61aa1f34d70f9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 3 Jun 2021 17:28:22 +0200 Subject: [PATCH 033/206] Implement pdfTeX auto node counting --- luamml-pdf.sty | 26 +++++++++++++++----------- pdfmml-logreader.lua | 13 ++++++++++++- pdfmml-showlists.lua | 32 ++++++++++++++++---------------- pdfmml.lua | 2 +- test_pdf.tex | 2 +- 5 files changed, 45 insertions(+), 30 deletions(-) diff --git a/luamml-pdf.sty b/luamml-pdf.sty index 0e2419d..67bcd15 100644 --- a/luamml-pdf.sty +++ b/luamml-pdf.sty @@ -58,21 +58,25 @@ % THIS VERSION IS SIGNIFICANTLY SLOWER \cs_new_protected:Npn \luamml_pdf_annotate:nn #1#2 { \int_gincr:N \g__luamml_annotation_id_int - \iow_write:Nx \c_log_iow { - LUAMML_COUNT_BEGIN: + \iow_shipout_x:Nx \c_log_iow { + \tl_to_str:e { + LUAMML_MARK: + \int_use:N \g__luamml_annotation_id_int + : + count = data.count[\int_use:N \g__luamml_annotation_id_int], + #1 + } + \exp_not:N \iow_newline: + LUAMML_MARK_END + } + \iow_now:Nx \c_log_iow { + LUAMML_COUNT: \int_use:N \g__luamml_annotation_id_int } \__luamml_pdf_showlists: - \iow_shipout:Nx \c_log_iow { - LUAMML_MARK: - \int_use:N \g__luamml_annotation_id_int - : - #1 - } #2 - \iow_write:Nx \c_log_iow { - LUAMML_COUNT_END: - \int_use:N \g__luamml_annotation_id_int + \iow_now:Nn \c_log_iow { + LUAMML_COUNT_END } \__luamml_pdf_showlists: } diff --git a/pdfmml-logreader.lua b/pdfmml-logreader.lua index 377f92d..4fb7c75 100644 --- a/pdfmml-logreader.lua +++ b/pdfmml-logreader.lua @@ -14,6 +14,16 @@ local luamml_block = l.Cg('LUAMML_FORMULA_BEGIN:' * id * l.P'\n'^1 * l.Ct( local luamml_mark = l.Cg('LUAMML_MARK:' * id * ':' * l.Cs((1 - l.P'\n' + l.Cg('\n' * l.Cc'' - '\nLUAMML_MARK_END\n'))^0) * '\nLUAMML_MARK_END\n' * l.Cc'marks') +local function add(a, b) return a + b end +local count_block = '### ' * line * l.Cf(l.Cc(0) * (('\\' * l.Cc(1))^-1 * line - '### ')^0, add) +local luamml_count = l.Cg('LUAMML_COUNT:' * id * l.P'\n'^1 + * count_block + * (line-'LUAMML_COUNT_END\n')^0 + * 'LUAMML_COUNT_END' * l.P'\n'^1 + * count_block / function(id, first, second) + return id, second - first + end * l.Cc'count') + local luamml_instruction = l.Cg('LUAMML_INSTRUCTION:' * l.Cc(nil) * l.C((1 - l.P'\n')^0) * '\n' * l.Cc'instructions') local function multi_table_set(t, key, value, table) @@ -22,9 +32,10 @@ local function multi_table_set(t, key, value, table) return t end local log_file = l.Cf(l.Ct(l.Cg(l.Ct'', 'groups') + * l.Cg(l.Ct'', 'count') * l.Cg(l.Ct'', 'marks') * l.Cg(l.Ct'', 'instructions')) - * (luamml_block + luamml_mark + luamml_instruction + line)^0, + * (luamml_block + luamml_mark + luamml_instruction + luamml_count + line)^0, multi_table_set) return function(filename) diff --git a/pdfmml-showlists.lua b/pdfmml-showlists.lua index af7f191..b271955 100644 --- a/pdfmml-showlists.lua +++ b/pdfmml-showlists.lua @@ -64,22 +64,22 @@ local fraction_noad = l.Ct('\\fraction, thickness ' local mathchoice_noad = l.Ct('\\mathchoice' * l.Cg(l.Cc'choice', 'id') * -1) -local mark_whatsit = '\\write-{LUAMML_MARK:' * (l.R'09'/tonumber) * ':' +local mark_whatsit = '\\write-{LUAMML_MARK:' * (l.R'09'^1/tonumber) * ':' local parse_list -local function parse_kernel(lines, i, prefix) +local function parse_kernel(lines, i, prefix, parsed) local line = lines[i] if not line or line:sub(1, #prefix) ~= prefix then return nil, i end local result = math_char:match(lines[i], #prefix + 1) if result then return result, i+1 end - result, i = parse_list(lines, i, prefix) + result, i = parse_list(lines, i, prefix, parsed) return {list = result, id = 'sub_mlist'}, i end -function parse_list(lines, i, prefix, marks) +function parse_list(lines, i, prefix, parsed) i = i or 1 prefix = prefix or '' local head, last - local mark_environment = {} + local mark_environment = {data = parsed,} local current_mark, current_count, current_offset while true do local skip @@ -87,9 +87,9 @@ function parse_list(lines, i, prefix, marks) if not line or line:sub(1, #prefix) ~= prefix then break end local simple = simple_noad:match(line, #prefix+1) if simple then - simple.nucleus, i = parse_kernel(lines, i + 1, prefix .. '.') - simple.sup, i = parse_kernel(lines, i, prefix .. '^') - simple.sub, i = parse_kernel(lines, i, prefix .. '_') + simple.nucleus, i = parse_kernel(lines, i + 1, prefix .. '.', parsed) + simple.sup, i = parse_kernel(lines, i, prefix .. '^', parsed) + simple.sub, i = parse_kernel(lines, i, prefix .. '_', parsed) if last then simple.prev, last.next = last, simple end @@ -97,8 +97,8 @@ function parse_list(lines, i, prefix, marks) else local fraction = fraction_noad:match(line, #prefix+1) if fraction then - fraction.num, i = parse_kernel(lines, i + 1, prefix .. '\\') - fraction.denom, i = parse_kernel(lines, i, prefix .. '/') + fraction.num, i = parse_kernel(lines, i + 1, prefix .. '\\', parsed) + fraction.denom, i = parse_kernel(lines, i, prefix .. '/', parsed) if last then fraction.prev, last.next = last, fraction end @@ -106,19 +106,19 @@ function parse_list(lines, i, prefix, marks) else local mathchoice = mathchoice_noad:match(line, #prefix+1) if mathchoice then - mathchoice.display, i = parse_list(lines, i + 1, prefix .. 'D') - mathchoice.text, i = parse_list(lines, i, prefix .. 'T') - mathchoice.script, i = parse_list(lines, i, prefix .. 'S') - mathchoice.scriptscript, i = parse_list(lines, i, prefix .. 's') + mathchoice.display, i = parse_list(lines, i + 1, prefix .. 'D', parsed) + mathchoice.text, i = parse_list(lines, i, prefix .. 'T', parsed) + mathchoice.script, i = parse_list(lines, i, prefix .. 'S', parsed) + mathchoice.scriptscript, i = parse_list(lines, i, prefix .. 's', parsed) if last then mathchoice.prev, last.next = last, mathchoice end last = mathchoice else skip = true - local mark = mark_whatsit:match(line) + local mark = mark_whatsit:match(line, #prefix+1) if mark then - local mark_table = assert(load('return {' .. assert(marks[mark], 'Undefined mark encountered') .. '}', nil, 't', mark_environment))() + local mark_table = assert(load('return {' .. assert(parsed.marks[mark], 'Undefined mark encountered') .. '}', nil, 't', mark_environment))() current_mark, current_count = mark_table, mark_table.count or 1 current_offset = mark_table.offset or current_count i = i + 1 diff --git a/pdfmml.lua b/pdfmml.lua index 2b45dcb..08d5d0b 100755 --- a/pdfmml.lua +++ b/pdfmml.lua @@ -55,7 +55,7 @@ end for i, block in ipairs(parsed.groups) do local stream = out_stream or assert(io.open(out_prefix .. tostring(i) .. out_suffix, 'w')) block = block[1] - local parsed = parse_showlists(block, nil, nil, parsed.marks) + local parsed = parse_showlists(block, nil, nil, parsed) local style = block.display and 0 or 2 stream:write( to_xml(convert.make_root(convert.process(parsed, style), style)), '\n' diff --git a/test_pdf.tex b/test_pdf.tex index 9b459f7..5f7d13f 100644 --- a/test_pdf.tex +++ b/test_pdf.tex @@ -16,7 +16,7 @@ } \ExplSyntaxOff -\protected\edef\models{\AnnotateFormula[3]{% +\protected\edef\models{\AnnotateFormula{% nucleus = true, core = {[0] = 'mi', '\noexpand\string\noexpand\u{22a7}'}, }{\unexpanded\expandafter{\models}}} From 948818c8bcdbf7fc294ba09ad21a992660c3621e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 4 Jun 2021 13:25:05 +0200 Subject: [PATCH 034/206] Generalize mn joining to family based joining --- luamml-convert.lua | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index 79b7994..f675339 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -107,6 +107,8 @@ local digit_map = {["0"] = true, ["1"] = true, -- Marker tables replacing the core operator for space like elements local space_like = {} +local text_families = {} + local nodes_to_table local function sub_style(s) return s//4*2+5 end @@ -249,7 +251,7 @@ local function maybe_to_mn(noad, core) core[0] = 'mn' end -local function noad_to_table(noad, sub, cur_style, mn) +local function noad_to_table(noad, sub, cur_style, joining) local nucleus, core = kernel_to_table(noad.nucleus, sub == noad_over and cur_style//2*2+1 or cur_style) if core and core[0] == 'mo' and core.minsize and not core.maxsize then core.maxsize = core.minsize -- This happens when a half-specified delimiter appears alone in a list. @@ -265,14 +267,15 @@ local function noad_to_table(noad, sub, cur_style, mn) end end if nucleus == core and #core == 1 then - if mn and core[0] == 'mi' and (core[1] == '.' or core[1] == ',') and maybe_to_mn(noad, core) or core[0] == 'mn' then - if mn then - mn[#mn+1] = core[1] - nucleus = do_sub_sup(mn, mn, noad, cur_style) - if nucleus == mn then - return nil, mn, mn + if joining and joining[0] == 'mn' and core[0] == 'mi' and (core[1] == '.' or core[1] == ',') and maybe_to_mn(noad, core) + or core[0] == 'mn' or text_families[core['tex:family']] then + if joining and core[0] == joining[0] and core['tex:family'] == joining['tex:family'] then + joining[#joining+1] = core[1] + nucleus = do_sub_sup(joining, joining, noad, cur_style) + if nucleus == joining then + return nil, joining, joining else - return nucleus, mn, false + return nucleus, joining, false end elseif not noad.sub and not noad.sup then return core, core, core @@ -499,9 +502,9 @@ function nodes_to_table(head, cur_style) local t = {[0] = 'mrow'} local result = t local nonscript - local core, last_noad, last_core, mn = space_like, nil, nil, nil + local core, last_noad, last_core, joining = space_like, nil, nil, nil for n, id, sub in node.traverse(head) do - local new_core, new_mn, new_node, new_noad + local new_core, new_joining, new_node, new_noad local props = properties[n] local mathml_core = props and props.mathml_core local mathml_table = props and (props.mathml_table or mathml_core) @@ -509,9 +512,9 @@ function nodes_to_table(head, cur_style) new_node, new_core = mathml_table, mathml_core elseif id == noad_t then local new_n - new_n, new_core, new_mn = noad_to_table(n, sub, cur_style, mn) - if new_mn == false then - t[#t], new_mn = new_n, nil + new_n, new_core, new_joining = noad_to_table(n, sub, cur_style, joining) + if new_joining == false then + t[#t], new_joining = new_n, nil else new_node = new_n -- might be nil end @@ -591,7 +594,7 @@ function nodes_to_table(head, cur_style) end t[#t+1] = new_node end - mn = new_mn + joining = new_joining end -- In TeX, groups are never space like if core == space_like then From e0705c210b8516320e944b3327b30a4ee8e736ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 6 Jun 2021 06:15:57 +0200 Subject: [PATCH 035/206] Add \RegisterFamilyMapping --- luamml-convert.lua | 1 + luamml-tex.lua | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/luamml-convert.lua b/luamml-convert.lua index f675339..a90f779 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -636,6 +636,7 @@ end return { register_family = register_remap, + register_text_family = function(fam) text_families[fam] = true end, process = function(head, style) return nodes_to_table(head, style or 2) end, make_root = to_math, } diff --git a/luamml-tex.lua b/luamml-tex.lua index 4febba1..b69be9b 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -2,6 +2,7 @@ local mlist_to_mml = require'luamml-convert' local process_mlist = mlist_to_mml.process local make_root = mlist_to_mml.make_root local register_family = mlist_to_mml.register_family +local register_text_family = mlist_to_mml.register_text_family local mappings = require'luamml-legacy-mappings' local write_xml = require'luamml-xmlwriter' @@ -23,6 +24,14 @@ lua.get_functions_table()[funcid] = function() end end +local funcid = luatexbase.new_luafunction'RegisterFamilyMapping' +token.set_lua('RegisterTextFamily', funcid, 'protected') +lua.get_functions_table()[funcid] = function() + local fam = token.scan_int() + local kind = token.scan_string() + register_text_family(fam, kind) +end + local function shallow_copy(t) local tt = {} for k,v in next, t do From dfee31b4b8c0e9d08af43e82509269be7b2dbf39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 6 Jun 2021 06:23:13 +0200 Subject: [PATCH 036/206] pdfmml \showstream support --- luamml-pdf.sty | 48 +++++++++++++++++++++++++++++--------------- pdfmml-logreader.lua | 2 +- pdfmml-showlists.lua | 2 +- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/luamml-pdf.sty b/luamml-pdf.sty index 67bcd15..d4ee290 100644 --- a/luamml-pdf.sty +++ b/luamml-pdf.sty @@ -1,26 +1,42 @@ \ProvidesExplPackage {luamml-pdf} {2021-05-31} {0.0.1-alpha} {MathML generation for LฬถuฬถaฬถpdfLaTeX} -\cs_new:Npn \__luamml_pdf_showlists: { - \group_begin: - \int_set:Nn \l_tmpa_int { \tex_interactionmode:D } - \int_set:Nn \tex_interactionmode:D { 0 } - \int_set:Nn \tex_showboxdepth:D { \c_max_int } - \int_set:Nn \tex_showboxbreadth:D { \c_max_int } - \tex_showlists:D - \int_set:Nn \tex_interactionmode:D { \l_tmpa_int } - \group_end: +\cs_if_exist:NTF \showstream { + \iow_new:N \l__luamml_pdf_stream + \iow_open:Nn \l__luamml_pdf_stream { \jobname .tml } + \cs_new_protected:Npn \__luamml_pdf_showlists: { + \group_begin: + \int_set:Nn \tex_showboxdepth:D { \c_max_int } + \int_set:Nn \tex_showboxbreadth:D { \c_max_int } + \showstream = \l__luamml_pdf_stream + \tex_showlists:D + \iow_now:Nx \l__luamml_pdf_stream {} + \group_end: + } +} { + \cs_set_eq:NN \l__luamml_pdf_stream \c_log_iow + \cs_set_eq:NN \__luamml_pdf_set_showstream: \scan_stop: + \cs_new_protected:Npn \__luamml_pdf_showlists: { + \group_begin: + \int_set:Nn \l_tmpa_int { \tex_interactionmode:D } + \int_set:Nn \tex_interactionmode:D { 0 } + \int_set:Nn \tex_showboxdepth:D { \c_max_int } + \int_set:Nn \tex_showboxbreadth:D { \c_max_int } + \tex_showlists:D + \int_set:Nn \tex_interactionmode:D { \l_tmpa_int } + \group_end: + } } \int_new:N \g__luamml_formula_id_int \cs_new_protected:Npn \luamml_pdf_write: { \int_gincr:N \g__luamml_formula_id_int - \iow_log:x { + \iow_now:Nx \l__luamml_pdf_stream { LUAMML_FORMULA_BEGIN: \int_use:N \g__luamml_formula_id_int } \__luamml_pdf_showlists: - \iow_log:x { + \iow_now:Nx \l__luamml_pdf_stream { LUAMML_FORMULA_END } } @@ -38,7 +54,7 @@ \int_new:N \g__luamml_annotation_id_int \cs_new_protected:Npn \luamml_pdf_annotate:nnn #1#2#3 { \int_gincr:N \g__luamml_annotation_id_int - \iow_shipout_x:Nx \c_log_iow { + \iow_shipout_x:Nx \l__luamml_pdf_stream { \tl_to_str:e { LUAMML_MARK: \int_use:N \g__luamml_annotation_id_int @@ -58,7 +74,7 @@ % THIS VERSION IS SIGNIFICANTLY SLOWER \cs_new_protected:Npn \luamml_pdf_annotate:nn #1#2 { \int_gincr:N \g__luamml_annotation_id_int - \iow_shipout_x:Nx \c_log_iow { + \iow_shipout_x:Nx \l__luamml_pdf_stream { \tl_to_str:e { LUAMML_MARK: \int_use:N \g__luamml_annotation_id_int @@ -69,20 +85,20 @@ \exp_not:N \iow_newline: LUAMML_MARK_END } - \iow_now:Nx \c_log_iow { + \iow_now:Nx \l__luamml_pdf_stream { LUAMML_COUNT: \int_use:N \g__luamml_annotation_id_int } \__luamml_pdf_showlists: #2 - \iow_now:Nn \c_log_iow { + \iow_now:Nx \l__luamml_pdf_stream { LUAMML_COUNT_END } \__luamml_pdf_showlists: } \NewDocumentCommand \RegisterFamilyMapping {m m} { - \iow_log:x { + \iow_now:Nx \l__luamml_pdf_stream { LUAMML_INSTRUCTION:REGISTER_MAPPING: \int_use:N #1 : #2 } } diff --git a/pdfmml-logreader.lua b/pdfmml-logreader.lua index 4fb7c75..8aa7bdd 100644 --- a/pdfmml-logreader.lua +++ b/pdfmml-logreader.lua @@ -3,7 +3,7 @@ local l = lpeg or require'lpeg' local line = (1-l.P'\n')^0 * '\n' local id = l.R'09'/tonumber -local non_final_list_block = (l.C((1-l.P'\n')^0) * '\n' - '### ')^0 +local non_final_list_block = (l.C((1-l.P'\n')^1) * '\n' - '### ' + '\n')^0 local math_lists_block = l.Ct('### ' * l.Cg(l.C'display' * ' ', 'display')^-1 * 'math mode entered at line ' * l.Cg(l.R'09'^1 / tonumber, 'line') * '\n' * non_final_list_block)^1 local generic_list_block = '### ' * (line - 'current page:') * non_final_list_block diff --git a/pdfmml-showlists.lua b/pdfmml-showlists.lua index b271955..ddaab6a 100644 --- a/pdfmml-showlists.lua +++ b/pdfmml-showlists.lua @@ -64,7 +64,7 @@ local fraction_noad = l.Ct('\\fraction, thickness ' local mathchoice_noad = l.Ct('\\mathchoice' * l.Cg(l.Cc'choice', 'id') * -1) -local mark_whatsit = '\\write-{LUAMML_MARK:' * (l.R'09'^1/tonumber) * ':' +local mark_whatsit = '\\write' * ('-' + l.R'09'^1) * '{LUAMML_MARK:' * (l.R'09'^1/tonumber) * ':' local parse_list local function parse_kernel(lines, i, prefix, parsed) From 57f54f6ef67c34cdabf938150262bb6920deb639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 6 Jun 2021 17:05:06 +0200 Subject: [PATCH 037/206] Remove old table system --- luamml-tex.lua | 25 ++----------------------- luamml.sty | 6 ------ 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/luamml-tex.lua b/luamml-tex.lua index b69be9b..e306879 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -45,17 +45,12 @@ end -- 1: Like 0, result is display math -- 2: Generate MathML, but only save it for later usage in startmath node -- 3: Skip --- 4: Prepend node list from buffer before generating --- 5: Like 5, result is display math --- 6: 2+4 --- 7: Skip but save copy of node list in buffer +-- 8: Generate MathML structure elements -- -- In other words: -- Bit 1: Suppress output -- Bit 0: Force display if 1 isn't set, if it is then skip MathML generation --- Bit 2: Integrate with table mechanism -local mlist_buffer local mlist_result, mlist_display local undefined_cmd = token.command_id'undefined_cs' @@ -81,21 +76,9 @@ end luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) local flag = tex.count.l__luamml_flag_int if flag & 3 == 3 then - if flag & 4 == 4 then - assert(mlist_buffer == nil) - mlist_buffer = node.copy_list(mlist) - end return true end - local new_mlist, buffer_tail - if flag & 4 == 4 then - new_mlist, buffer_tail = assert(mlist_buffer), node.tail(mlist_buffer) - mlist.prev, buffer_tail.next = buffer_tail, mlist - mlist_buffer = nil - else - new_mlist = mlist - end - local xml, core = process_mlist(new_mlist, style == 'display' and 0 or 2) + local xml, core = process_mlist(mlist, style == 'display' and 0 or 2) if flag & 2 == 0 then save_result(xml, style == 'display' or flag & 1 == 1) end @@ -111,10 +94,6 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) end props.saved_mathml_table, props.saved_mathml_core = xml, core end - if buffer_tail then - mlist.prev, buffer_tail.next = nil, nil - node.flush_list(new_mlist) - end return true end, 'dump_list') diff --git a/luamml.sty b/luamml.sty index f3dec3d..19edb10 100644 --- a/luamml.sty +++ b/luamml.sty @@ -12,12 +12,6 @@ \cs_new:Npn \luamml_flag_ignore: { \int_set:Nn \l__luamml_flag_int { 3 } } -\cs_new:Npn \luamml_flag_alignment_left: { - \int_set:Nn \l__luamml_flag_int { 7 } -} -\cs_new:Npn \luamml_flag_alignment_right: { - \int_set:Nn \l__luamml_flag_int { 6 } -} \cs_new:Npn \luamml_flag_structelem: { \int_set:Nn \l__luamml_flag_int { 8 } } From 1bda0c5892338bf6e0e6e27e62cbff640206eaa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 16 Jun 2021 15:14:32 +0200 Subject: [PATCH 038/206] Adapt to new pdfTeX patch version --- luamml-pdf.sty | 1 - 1 file changed, 1 deletion(-) diff --git a/luamml-pdf.sty b/luamml-pdf.sty index d4ee290..d91ef6d 100644 --- a/luamml-pdf.sty +++ b/luamml-pdf.sty @@ -10,7 +10,6 @@ \int_set:Nn \tex_showboxbreadth:D { \c_max_int } \showstream = \l__luamml_pdf_stream \tex_showlists:D - \iow_now:Nx \l__luamml_pdf_stream {} \group_end: } } { From fba9e02b925d6ae0861a63a9a60f677ddfd71d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 16 Jun 2021 15:16:14 +0200 Subject: [PATCH 039/206] Support pdfMML annotations in LuaTeX --- luamml-pdf.sty | 4 +- luamml-tex-annotate.lua | 100 ++++++++++++++++++++++++++++++++++++++++ luamml-tex.lua | 2 + luamml.sty | 14 ++++++ test_pdf.tex | 4 +- 5 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 luamml-tex-annotate.lua diff --git a/luamml-pdf.sty b/luamml-pdf.sty index d91ef6d..50ba948 100644 --- a/luamml-pdf.sty +++ b/luamml-pdf.sty @@ -51,7 +51,7 @@ % #2 annotation % #3 nodes to be annotated \int_new:N \g__luamml_annotation_id_int -\cs_new_protected:Npn \luamml_pdf_annotate:nnn #1#2#3 { +\cs_new_protected:Npn \luamml_annotate:nen #1#2#3 { \int_gincr:N \g__luamml_annotation_id_int \iow_shipout_x:Nx \l__luamml_pdf_stream { \tl_to_str:e { @@ -71,7 +71,7 @@ % #1 annotation % #2 nodes to be annotated % THIS VERSION IS SIGNIFICANTLY SLOWER -\cs_new_protected:Npn \luamml_pdf_annotate:nn #1#2 { +\cs_new_protected:Npn \luamml_annotate:en #1#2 { \int_gincr:N \g__luamml_annotation_id_int \iow_shipout_x:Nx \l__luamml_pdf_stream { \tl_to_str:e { diff --git a/luamml-tex-annotate.lua b/luamml-tex-annotate.lua new file mode 100644 index 0000000..cb7a8ed --- /dev/null +++ b/luamml-tex-annotate.lua @@ -0,0 +1,100 @@ +local nest = tex.nest + +local properties = node.get_properties_table() + +local mark_environment = {} + +local function annotate() + local annotation, err = load( 'return {' + .. token.scan_argument() + .. '}', nil, 't', mark_environment) + if not annotation then + tex.error('Error while parsing LuaMML annotation', {err}) + return 0 + end + annotation = annotation() + local nesting = nest.top + local props = properties[nesting.head] + local current = props and props.luamml__annotate_context + if current then + current, props.luamml__annotate_context = current.head, current.prev + else + tex.error('Mismatched LuaMML annotation', + {'Something odd happened. Maybe you forgot braces around an annotated symbol in a subscript or superscript?'}) + return 0 + end + local after = nesting.tail + local count, offset = 0, annotation.offset + local marked + if current == after then + tex.error'Empty LuaMML annotation' + else + repeat + current = current.next + count = count + 1 + if count == offset then + marked = current + elseif offset or current ~= after then + local props = properties[current] + if not props then + props = {} + properties[current] = props + end + props.mathml_table, props.mathml_core = nil, false + end + until current == after + if offset and not marked then + tex.error'Invalid offset in LuaMML annotation' + end + marked = marked or current + if annotation.nucleus then + marked = marked.nucleus + end + if marked then + local props = properties[marked] + if not props then + props = {} + properties[marked] = props + end + props.mathml_core = annotation.core + else + tex.error'Unable to annotate nucleus of node without nucleus' + end + end + return count +end + +local funcid = luatexbase.new_luafunction'__luamml_annotate_begin:' +token.set_lua('__luamml_annotate_begin:', funcid, 'protected') +lua.get_functions_table()[funcid] = function() + local top = nest.top + local temp = top.head + local props = properties[temp] + if not props then + props = {} + properties[temp] = props + end + props.luamml__annotate_context = { + prev = props.luamml__annotate_context, + head = top.tail, + } +end + +funcid = luatexbase.new_luafunction'__luamml_annotate_end:we' +token.set_lua('__luamml_annotate_end:we', funcid, 'protected') +lua.get_functions_table()[funcid] = function() + local count = token.scan_int() + local real_count = annotate() + if count ~= real_count then + tex.error('Incorrect count in LuaMML annotation', { + 'A LuaMML annotation was discovered with an explicit count \z + which was not the same as the number of top-level nodes annotated.', + string.format('This can be fixed by changing the supplied count from %i to %i \z + or by omitting the count value entirely.', count, real_count) + }) + end +end + +funcid = luatexbase.new_luafunction'__luamml_annotate_end:e' +token.set_lua('__luamml_annotate_end:e', funcid, 'protected') +lua.get_functions_table()[funcid] = annotate diff --git a/luamml-tex.lua b/luamml-tex.lua index e306879..530c72f 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -113,6 +113,8 @@ lua.get_functions_table()[funcid] = function() mlist_result = nil end +require'luamml-tex-annotate' + return { save_result = save_result, } diff --git a/luamml.sty b/luamml.sty index 19edb10..80e6d70 100644 --- a/luamml.sty +++ b/luamml.sty @@ -19,6 +19,20 @@ \tl_set:Nn \l__luamml_filename_tl } + +\cs_new_protected:Npn \luamml_annotate:nen #1#2#3 { + \__luamml_annotate_begin: + #3 + \__luamml_annotate_end:we \tex_numexpr:D #1 \scan_stop: {#2} +} + +\cs_new_protected:Npn \luamml_annotate:en #1#2 { + \__luamml_annotate_begin: + #2 + \__luamml_annotate_end:e {#1} +} + + \cs_new:Npn \__luamml_patch_package:nn #1 #2 { \@ifpackageloaded {#1} {#2} { \hook_gput_code:nnn {package/after/#1} {luamml} {#2} diff --git a/test_pdf.tex b/test_pdf.tex index 5f7d13f..be803a7 100644 --- a/test_pdf.tex +++ b/test_pdf.tex @@ -9,9 +9,9 @@ \cs_set_eq:NN \WriteoutFormula \luamml_pdf_write: \NewDocumentCommand\AnnotateFormula{ o m m }{% \IfValueTF{#1}{% - \luamml_pdf_annotate:nnn{#1}% + \luamml_annotate:nnn{#1}% }{ - \luamml_pdf_annotate:nn + \luamml_annotate:nn }{#2}{#3} } \ExplSyntaxOff From 702e974485585d368f0b571088b81792d80e5c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 16 Jun 2021 15:19:26 +0200 Subject: [PATCH 040/206] New flag values --- luamml-tex.lua | 63 +++++++++++++++++++++++++++++++------------------- luamml.sty | 27 ++++++++++++++++++---- 2 files changed, 61 insertions(+), 29 deletions(-) diff --git a/luamml-tex.lua b/luamml-tex.lua index 530c72f..118e194 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -41,51 +41,63 @@ local function shallow_copy(t) end -- Possible flag values: --- 0: Normal (This is the only supported one in display mode) --- 1: Like 0, result is display math --- 2: Generate MathML, but only save it for later usage in startmath node --- 3: Skip --- 8: Generate MathML structure elements +-- 0: Skip +-- 1: Generate MathML, but only save it for later usage in startmath node +-- 3: Normal (This is the only supported one in display mode) +-- 11: Generate MathML structure elements -- --- In other words: --- Bit 1: Suppress output --- Bit 0: Force display if 1 isn't set, if it is then skip MathML generation +-- More generally, flags is a bitfield with the defined bits: +-- Bit 5-7: See Bit 4 +-- Bit 4: Overwrite mathstyle with bit 9-11 +-- Bit 3: Generate MathML structure elements +-- Bit 2: Reserved +-- Bit 1: Save MathML as a fully converted formula +-- Bit 0: Save MathML for later usage in startmath node. Ignored for display math. -local mlist_result, mlist_display +local mlist_result local undefined_cmd = token.command_id'undefined_cs' local call_cmd = token.command_id'call' -local function save_result(xml, display) - mlist_result, mlist_display = xml, display +local function save_result(xml, display, structelem) + mlist_result = make_root(xml, display and 0 or 2) token.put_next(filename_token) local filename = token.scan_argument() local tracing = tex.count.tracingmathml > 1 - local xml_root = (filename ~= '' or tracing) and make_root(shallow_copy(xml), display and 0 or 2) if filename ~= '' then assert(io.open(filename, 'w')) - :write(write_xml(xml_root, true):sub(2) .. '\n') + :write(write_xml(mlist_result, true):sub(2) .. '\n') :close() end if tracing then - -- Here xml gets wrapped in an mrow to avoid modifying it. - texio.write_nl(write_xml(xml_root) .. '\n') + texio.write_nl(write_xml(mlist_result) .. '\n') end + return mlist_result end luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) local flag = tex.count.l__luamml_flag_int - if flag & 3 == 3 then + if flag & 3 == 0 then return true end - local xml, core = process_mlist(mlist, style == 'display' and 0 or 2) - if flag & 2 == 0 then - save_result(xml, style == 'display' or flag & 1 == 1) + local display = style == 'display' + style = flag & 4 == 4 and flag>>5 & 0x7 or display and 0 or 2 + local xml, core = process_mlist(mlist, style) + local processed_xml + if flag & 2 == 2 then + processed_xml = save_result(shallow_copy(xml), display) + else + local element_type = token.get_macro'l__luamml_root_tl' + if element_type ~= 'mrow' then + if xml[0] == 'mrow' then + xml[0] = element_type + else + xml = {[0] = element_type, xml} + end + end + processed_xml = xml end - if flag & 8 == 8 then - write_struct(make_root(shallow_copy(xml), (style == 'display' or flag & 1 == 1) and 0 or 2)) - end - if style == 'text' then + if not display and flag & 1 == 1 then local startmath = tex.nest.top.tail local props = properties[startmath] if not props then @@ -94,6 +106,9 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) end props.saved_mathml_table, props.saved_mathml_core = xml, core end + if flag & 8 == 8 then + write_struct(shallow_copy(processed_xml), display and 0 or 2) + end return true end, 'dump_list') @@ -105,7 +120,7 @@ lua.get_functions_table()[funcid] = function() "I was asked to provide MathML code for the last formula, but there weren't any new formulas since you last asked." }) end - local mml = write_xml(make_root(mlist_result, mlist_display and 0 or 2)) + local mml = write_xml(mlist_result) if tex.count.tracingmathml == 1 then texio.write_nl(mml .. '\n') end diff --git a/luamml.sty b/luamml.sty index 80e6d70..76cb22f 100644 --- a/luamml.sty +++ b/luamml.sty @@ -3,21 +3,38 @@ \int_new:N \l__luamml_flag_int \tl_new:N \l__luamml_filename_tl +\tl_new:N \l__luamml_root_tl +\tl_set:Nn \l__luamml_root_tl { mrow } \int_new:N \tracingmathml \lua_now:n { require'luamml-tex' } -\cs_new:Npn \luamml_flag_save: { - \int_set:Nn \l__luamml_flag_int { 2 } -} -\cs_new:Npn \luamml_flag_ignore: { +\cs_new:Npn \luamml_flag_process: { \int_set:Nn \l__luamml_flag_int { 3 } } +\cs_new:Npn \luamml_flag_save: { + \int_set:Nn \l__luamml_flag_int { 1 } +} +\cs_new:Npn \luamml_flag_save:N #1 { + \int_set:Nn \l__luamml_flag_int { 17 + 32 * #1 } +} +\cs_new:Npn \luamml_flag_save:Nn #1 { + \int_set:Nn \l__luamml_flag_int { 21 + 32 * #1 } + \tl_set:Nn \l__luamml_root_tl +} +\cs_new:Npn \luamml_flag_save:n { + \int_set:Nn \l__luamml_flag_int { 5 } + \tl_set:Nn \l__luamml_root_tl +} +\cs_new:Npn \luamml_flag_ignore: { + \int_set:Nn \l__luamml_flag_int { 0 } +} \cs_new:Npn \luamml_flag_structelem: { - \int_set:Nn \l__luamml_flag_int { 8 } + \int_set:Nn \l__luamml_flag_int { 11 } } \cs_new:Npn \luamml_set_filename:n { \tl_set:Nn \l__luamml_filename_tl } +\luamml_flag_process: \cs_new_protected:Npn \luamml_annotate:nen #1#2#3 { From 209f0cb13bba72411ad893e16157c7734b12b20d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 16 Jun 2021 15:19:48 +0200 Subject: [PATCH 041/206] Start using new flags --- luamml-patches-amsmath.sty | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index daabb73..b37bf4d 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -17,7 +17,7 @@ \ifmeasuring@ \luamml_flag_ignore: \else - \luamml_flag_save: + \luamml_flag_save:N \displaystyle \fi $ } @@ -41,7 +41,7 @@ \ifmeasuring@ \luamml_flag_ignore: \else - \luamml_flag_save: + \luamml_flag_save:N \displaystyle \fi $ } From a673af336c7080bf41204aa1c7c82dc138609f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 16 Jun 2021 15:21:30 +0200 Subject: [PATCH 042/206] Add luamml-demo package with reasonable defaults --- luamml-demo.sty | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 luamml-demo.sty diff --git a/luamml-demo.sty b/luamml-demo.sty new file mode 100644 index 0000000..377f658 --- /dev/null +++ b/luamml-demo.sty @@ -0,0 +1,62 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{luamml-demo}[2021-06-16 Reasonable default definitions for luamml] + +\RequirePackage{luamml}% Loading luamml is pretty much the point +\RequirePackage{amsmath,array}% AThese are more or less exepcted in luamml especially for advanced constructs + +\AtBeginDocument{% + \@ifpackageloaded{unicode-math}{}{% + \RegisterFamilyMapping\symsymbols{oms}% + \RegisterFamilyMapping\symletters{oml}% + \RegisterFamilyMapping\symlargesymbols{omx}% + } +} + +\ExplSyntaxOn +\DeclareOption{tracing}{ + \tracingmathml=2 +} +\DeclareOption{structelem}{ + \luamml_flag_structelem: +} +\DeclareOption{files}{ + \int_new:N \g__luamml_demo_mathml_int + \luamml_set_filename:n { + \immediateassignment \int_gincr:N \g__luamml_demo_mathml_int + \jobname -formula- \int_use:N \g__luamml_demo_mathml_int .mml + } +} +\ProcessOptions\relax + +\cs_new_eq:NN \LuaMMLSetFilename \luamml_set_filename:n + +\cs_generate_variant:Nn \__pdffile_filespec_write:nnn {ene} +\int_new:N \g__luamml_demo_af_int +\cs_new_protected:Npn \LuaMMLTagAF #1#2 { + \int_gincr:N \g__luamml_demo_af_int + \exp_args:Ne \pdf_object_new:nn{__luamml_demo_\int_use:N \g__luamml_demo_af_int}{dict} + \exp_args:Ne \tagstructbegin{tag=Formula,AF=__luamml_demo_\int_use:N \g__luamml_demo_af_int,#1} + \tagmcbegin{tag=Formula} + #2 + \group_begin: + \pdfdict_put:nnn {l_pdffile/Filespec} {AFRelationship}{/Supplement} + \__pdffile_filespec_write:ene + { __luamml_demo_ \int_use:N \g__luamml_demo_af_int } + { test.mml } + { \luamml_get_last_mathml_stream:e{}\c_space_tl 0~R} + \group_end: + \tagmcend + \tagstructend +} + +\NewDocumentCommand\AnnotateFormula{ o m m }{% + \IfValueTF{#1}{% + \luamml_annotate:nen{#1}% + }{ + \luamml_annotate:en + }{#2}{#3} +} + +\ExplSyntaxOff + +\endinput From fd9c8f4fcc2cd2b3ffab713b853ad0f3fa6c7198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 16 Jun 2021 15:22:23 +0200 Subject: [PATCH 043/206] Use luamml-demo for test_tex --- test_tex.tex | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/test_tex.tex b/test_tex.tex index 3b021a9..4e4a043 100644 --- a/test_tex.tex +++ b/test_tex.tex @@ -1,22 +1,20 @@ +\RequirePackage{pdfmanagement-testphase} +\DeclareDocumentMetadata{ + uncompress, + pdfversion = 2.0, +} \documentclass{article} -\usepackage{luamml} -\usepackage{amsmath,array} +\usepackage{luamml-demo} +\usepackage{tagpdf} +\tagpdfsetup{ + activate-all, + interwordspace=true, +} \usepackage{unicode-math} -%% Uncomment the following lines when used without unicode-math -% \RegisterFamilyMapping\symsymbols{oms} -% \RegisterFamilyMapping\symletters{oml} -% \RegisterFamilyMapping\symlargesymbols{omx} - -\ExplSyntaxOn -\tracingmathml=2 -\pdfvariable compresslevel=0 -\cs_new_protected:Npn \ShowMathMLObj { - \message { \luamml_get_last_mathml_stream:e{}~0~R } -} -\ExplSyntaxOff \begin{document} +\tagstructbegin{tag=Document} \[ \begin{pmatrix} 1 & 0 & 0 \\ @@ -29,7 +27,6 @@ 2 & $else$ \end{cases} \] -\ShowMathMLObj \[ x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}. \] @@ -37,11 +34,14 @@ \sum_a\underline c\dot bc' \] +\LuaMMLTagAF{} { \begin{align} abc&=def & e^{\mathrm{i}\pi}&=-1\\ \Big(1+2&=3\Big)\\ 5 \end{align} +} -Es gilt $\sin(x)-\sin(x+2\pi)=0$. +Es gilt \LuaMMLTagAF{}{$\sin(x)-\sin(x+2\pi)=0$}. +\tagstructend \end{document} From d5c0f98b910576b3e8e2b5070e291b1ace248bb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 16 Jun 2021 17:02:47 +0200 Subject: [PATCH 044/206] s/\.mml/\.xml/g --- luamml-demo.sty | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/luamml-demo.sty b/luamml-demo.sty index 377f658..fecad5c 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -23,7 +23,7 @@ \int_new:N \g__luamml_demo_mathml_int \luamml_set_filename:n { \immediateassignment \int_gincr:N \g__luamml_demo_mathml_int - \jobname -formula- \int_use:N \g__luamml_demo_mathml_int .mml + \jobname -formula- \int_use:N \g__luamml_demo_mathml_int .xml } } \ProcessOptions\relax @@ -42,7 +42,7 @@ \pdfdict_put:nnn {l_pdffile/Filespec} {AFRelationship}{/Supplement} \__pdffile_filespec_write:ene { __luamml_demo_ \int_use:N \g__luamml_demo_af_int } - { test.mml } + { test.xml } { \luamml_get_last_mathml_stream:e{}\c_space_tl 0~R} \group_end: \tagmcend From 6cb32caeb841e21d29c8bc6259ed34e844874279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 17 Jun 2021 13:29:16 +0200 Subject: [PATCH 045/206] Use AF tagging in example --- test_tex.tex | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test_tex.tex b/test_tex.tex index 4e4a043..8cc28cc 100644 --- a/test_tex.tex +++ b/test_tex.tex @@ -15,6 +15,7 @@ \begin{document} \tagstructbegin{tag=Document} +\LuaMMLTagAF{} { \[ \begin{pmatrix} 1 & 0 & 0 \\ @@ -27,12 +28,17 @@ 2 & $else$ \end{cases} \] +} +\LuaMMLTagAF{} { \[ x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}. \] +} +\LuaMMLTagAF{} { \[ \sum_a\underline c\dot bc' \] +} \LuaMMLTagAF{} { \begin{align} From cd11aa478c79a396694f02140137bfcb92cb9c88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 17 Jun 2021 13:29:32 +0200 Subject: [PATCH 046/206] Use official interfaces instead of internals --- luamml-demo.sty | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/luamml-demo.sty b/luamml-demo.sty index fecad5c..3667e60 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -30,7 +30,7 @@ \cs_new_eq:NN \LuaMMLSetFilename \luamml_set_filename:n -\cs_generate_variant:Nn \__pdffile_filespec_write:nnn {ene} +\cs_generate_variant:Nn \pdffile_filespec:nnn {ene} \int_new:N \g__luamml_demo_af_int \cs_new_protected:Npn \LuaMMLTagAF #1#2 { \int_gincr:N \g__luamml_demo_af_int @@ -40,7 +40,7 @@ #2 \group_begin: \pdfdict_put:nnn {l_pdffile/Filespec} {AFRelationship}{/Supplement} - \__pdffile_filespec_write:ene + \pdffile_filespec:ene { __luamml_demo_ \int_use:N \g__luamml_demo_af_int } { test.xml } { \luamml_get_last_mathml_stream:e{}\c_space_tl 0~R} From fcfe981c9e34bb88f5ca7ceb7e41b7b2b68dcf03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 18 Jun 2021 23:03:39 +0200 Subject: [PATCH 047/206] Support aligned --- luamml-amsmath.lua | 53 ++++++++++++++++++++++++++++++- luamml-patches-amsmath.sty | 64 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 113 insertions(+), 4 deletions(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index eacb91f..40da8c4 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -8,6 +8,23 @@ local to_text = require'luamml-lr' local properties = node.get_properties_table() +local math_t = node.id'math' + +local funcid = luatexbase.new_luafunction'__luamml_amsmath_add_last_to_row:' +token.set_lua('__luamml_amsmath_add_last_to_row:', funcid, 'protected') +lua.get_functions_table()[funcid] = function() + -- TODO: Error handling etc + -- local box = token.scan_int() + local nest = tex.nest.top + local head, startmath = nest.head, nest.tail + repeat + startmath = startmath.prev + until startmath == head or (startmath.id == math_t and startmath.subtype == 0) + if startmath == head then return end + assert(startmath.id == node.id"math") + store_column(startmath, true) +end + local funcid = luatexbase.new_luafunction'__luamml_amsmath_add_box_to_row:' token.set_lua('__luamml_amsmath_add_box_to_row:', funcid, 'protected') lua.get_functions_table()[funcid] = function() @@ -15,10 +32,44 @@ lua.get_functions_table()[funcid] = function() -- local box = token.scan_int() local boxnum = 0 local startmath = tex.box[boxnum].list - assert(startmath.id == node.id"math") + assert(startmath.id == math_t) store_column(startmath, true) end +do + local saved + funcid = luatexbase.new_luafunction'__luamml_amsmath_save_inner_table:' + token.set_lua('__luamml_amsmath_save_inner_table:', funcid) + lua.get_functions_table()[funcid] = function() + -- TODO: Error handling etc + local mml_table = get_table() + if not mml_table then return end + mml_table.displaystyle = true + local columns = node.count(node.id'align_record', tex.lists.align_head)//2 + mml_table.columnalign = string.rep('right left', columns, ' ') + local spacing = {} + for n in node.traverse_id(node.id'glue', tex.lists.align_head) do + spacing[#spacing+1] = n.width == 0 and '0' or string.format('%.3f', n.width/65781.76) + end + mml_table.columnspacing = table.concat(spacing, ' ', 2, #spacing-2) + saved = mml_table + end + + funcid = luatexbase.new_luafunction'__luamml_amsmath_finalize_inner_table:' + token.set_lua('__luamml_amsmath_finalize_inner_table:', funcid) + lua.get_functions_table()[funcid] = function() + -- TODO: Error handling etc + local vcenter = tex.nest.top.tail.nucleus + local props = properties[vcenter] + if not props then + props = {} + properties[vcenter] = props + end + props.mathml_table = assert(saved) + saved = nil + end +end + funcid = luatexbase.new_luafunction'__luamml_amsmath_finalize_table:' token.set_lua('__luamml_amsmath_finalize_table:', funcid) lua.get_functions_table()[funcid] = function() diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index b37bf4d..c5d2423 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -3,6 +3,65 @@ \lua_now:n { require'luamml-amsmath' } +\cs_set:Npn \start@aligned #1#2 { + \RIfM@ + \else + \nonmatherr@ { \begin { \@currenvir } } + \fi + \savecolumn@ % Assumption: called inside a group + \alignedspace@left + \ams@start@box {#1} \bgroup + \maxfields@ #2 \relax + \ifnum \maxfields@ > \m@ne + \multiply \maxfields@ \tw@ + \let \math@cr@@@ \math@cr@@@alignedat + \alignsep@ \z@skip + \else + \let \math@cr@@@ \math@cr@@@aligned + \alignsep@ \minalignsep + \fi + \Let@ \chardef \dspbrk@context \@ne + \default@tag + \spread@equation % no-op if already called + \global \column@ \z@ + \ialign \bgroup + & \column@plus + \hfil + \strut@ + $ + \m@th + \displaystyle + {##} + \luamml_flag_save:N \displaystyle + $ + \__luamml_amsmath_add_last_to_row: + \tabskip \z@skip + & \column@plus + $ + \m@th + \displaystyle + { + {} + ## + } + \luamml_flag_save:N \displaystyle + $ + \__luamml_amsmath_add_last_to_row: + \hfil + \tabskip\alignsep@ + \crcr + \ams@return@opt@arg +} + +\cs_set:Npn \endaligned { + \crcr + \__luamml_amsmath_save_inner_table: + \egroup + \restorecolumn@ + \egroup + \__luamml_amsmath_finalize_inner_table: +} + \cs_set:Npn \align@preamble { & \hfil @@ -11,9 +70,8 @@ \@lign $ \m@th - \displaystyle { - ## - } + \displaystyle + {##} \ifmeasuring@ \luamml_flag_ignore: \else From 71b8d151d45340aa1252464a036fd21b28bb3c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 18 Jun 2021 23:15:12 +0200 Subject: [PATCH 048/206] Avoid empty mtext before aligned --- luamml-convert.lua | 1 + luamml-patches-amsmath.sty | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index a90f779..1af5e24 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -253,6 +253,7 @@ end local function noad_to_table(noad, sub, cur_style, joining) local nucleus, core = kernel_to_table(noad.nucleus, sub == noad_over and cur_style//2*2+1 or cur_style) + if not nucleus then return end if core and core[0] == 'mo' and core.minsize and not core.maxsize then core.maxsize = core.minsize -- This happens when a half-specified delimiter appears alone in a list. -- If it has a minimal size, it should be fixed to that size (since there is nothing bigger in it's list) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index c5d2423..2de1036 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -9,7 +9,11 @@ \nonmatherr@ { \begin { \@currenvir } } \fi \savecolumn@ % Assumption: called inside a group - \alignedspace@left + \luamml_annotate:en { + nucleus = true, core = false + } { + \alignedspace@left + } \ams@start@box {#1} \bgroup \maxfields@ #2 \relax \ifnum \maxfields@ > \m@ne From 9e501b2d766bcbea42617b58d9b5cc41a5eb7c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 22 Jun 2021 12:56:04 +0200 Subject: [PATCH 049/206] Don't try to tag \eqno elements --- luamml-tex.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/luamml-tex.lua b/luamml-tex.lua index 118e194..2581a7c 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -11,6 +11,17 @@ local write_struct = require'luamml-structelemwriter' local filename_token = token.create'l__luamml_filename_tl' local properties = node.get_properties_table() +local mmode, hmode, vmode do + local result, input = {}, tex.getmodevalues() + for k,v in next, tex.getmodevalues() do + if v == 'math' then mmode = k + elseif v == 'horizontal' then hmode = k + elseif v == 'vertical' then vmode = k + else assert(v == 'unset') + end + end + assert(mmode and hmode and vmode) +end local funcid = luatexbase.new_luafunction'RegisterFamilyMapping' token.set_lua('RegisterFamilyMapping', funcid, 'protected') @@ -76,6 +87,9 @@ local function save_result(xml, display, structelem) end luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) + if tex.nest.top.mode == mmode then -- This is a equation label generated with \eqno + return true + end local flag = tex.count.l__luamml_flag_int if flag & 3 == 0 then return true From f6c7bb6b9811286ac171875187f486aeadf82422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 22 Jun 2021 16:59:38 +0200 Subject: [PATCH 050/206] Don't break tabular when array is loaded --- luamml-patches-array.sty | 47 ++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/luamml-patches-array.sty b/luamml-patches-array.sty index 854416b..757b027 100644 --- a/luamml-patches-array.sty +++ b/luamml-patches-array.sty @@ -12,32 +12,47 @@ \hfil \hskip 1sp \d@llarbegin - \__luamml_array_init_col: - \insert@column - \luamml_flag_save: - \d@llarend - \__luamml_array_finalize_col:w 0~ + \cs_if_eq:NNTF \d@llarbegin \begingroup { + \insert@column + \d@llarend + } { + \__luamml_array_init_col: + \insert@column + \luamml_flag_save: + \d@llarend + \__luamml_array_finalize_col:w 0~ + } \do@row@strut \hfil \or \hskip 1sp \d@llarbegin - \__luamml_array_init_col: - \insert@column - \luamml_flag_save: - \d@llarend - \__luamml_array_finalize_col:w 1~ + \cs_if_eq:NNTF \d@llarbegin \begingroup { + \insert@column + \d@llarend + } { + \__luamml_array_init_col: + \insert@column + \luamml_flag_save: + \d@llarend + \__luamml_array_finalize_col:w 1~ + } \do@row@strut \hfil \or \hfil \hskip 1sp \d@llarbegin - \__luamml_array_init_col: - \insert@column - \luamml_flag_save: - \d@llarend - \__luamml_array_finalize_col:w 2~ + \cs_if_eq:NNTF \d@llarbegin \begingroup { + \insert@column + \d@llarend + } { + \__luamml_array_init_col: + \insert@column + \luamml_flag_save: + \d@llarend + \__luamml_array_finalize_col:w 2~ + } \do@row@strut \or \setbox \ar@mcellbox \vbox \@startpbox { \@nextchar } @@ -65,7 +80,7 @@ \__luamml_array_save_array: \egroup \egroup - \__luamml_array_finalize_array: + \mode_if_math:T { \__luamml_array_finalize_array: } \@arrayright \gdef \@preamble {} } From 8834b6af0d10c5462676c69b270feb35cfc58a53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 22 Jun 2021 17:00:14 +0200 Subject: [PATCH 051/206] Start on documentation --- build.lua | 1 + luamml.dtx | 237 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 238 insertions(+) create mode 100644 luamml.dtx diff --git a/build.lua b/build.lua index 82ac3ca..7952989 100644 --- a/build.lua +++ b/build.lua @@ -1,5 +1,6 @@ module = "luamml" +typesetexe = "lualatex" tdsroot = "lualatex" installfiles = { "luamml-*.lua", "*.sty" } stdengine = "luatex" diff --git a/luamml.dtx b/luamml.dtx new file mode 100644 index 0000000..5cc917d --- /dev/null +++ b/luamml.dtx @@ -0,0 +1,237 @@ +% \iffalse meta-comment +% +%% Copyright (C) 2020-2021 by Marcel Krueger +%% +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3c of this license or (at your option) any later +%% version. The latest version of this license is in: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% and version 1.3 or later is part of all distributions of +%% LaTeX version 2005/12/01 or later. +% +%<*batch> +%<*gobble> +\ifx\jobname\relax\let\documentclass\undefined\fi +\ifx\documentclass\undefined +\csname fi\endcsname +% +\input docstrip.tex +\keepsilent +\generate{\file{luamml.sty}{\from{luamml.dtx}{package}}} +\endbatchfile +% +%<*gobble> +\fi +\expandafter\ifx\csname @currname\endcsname\empty +\csname fi\endcsname +% +%<*driver> +\documentclass{l3doc} +\usepackage{luamml} +\usepackage{csquotes,luacolor} +\RecordChanges +\begin{document} +\tracingmathml2 +\DocInput{luamml.dtx} +\PrintIndex +\PrintChanges +\end{document} +% +%<*gobble> +\fi +% +% \fi +% +% \title{The \pkg{luamml} package} +% +% \author{Marcel Krรผger} +% +% \maketitle +% +% \begin{documentation} +% \end{documentation} +% +% \begin{implementation} +% \section{Package Implementation} +% \iffalse +%<*package> +% \fi +% \begin{macrocode} +%<@@=luamml> +\ProvidesExplPackage {luamml} {2021-04-23} {0.0.1-alpha} + {Automatically generate presentational MathML from LuaTeX math expressions} +% \end{macrocode} +% +% \subsection{Initialization} +% These variable have to appear before the Lua module is loaded and will be used to +% communicate information to the callback. +% +% Here \cs{tracingmathml} does not use a expl3 name since it is not intended for +% programming use but only as a debugging helper for the user. +% The other variables are internal, but we provide public interfaces for setting +% them later. +% \begin{macrocode} +\int_new:N \l__luamml_flag_int +\tl_new:N \l__luamml_filename_tl +\tl_new:N \l__luamml_root_tl +\tl_set:Nn \l__luamml_root_tl { mrow } +\int_new:N \tracingmathml +% \end{macrocode} +% +% Now we can load the Lua module which defines the callback. +% \begin{macrocode} +\lua_now:n { require'luamml-tex' } +% \end{macrocode} +% +% \subsection{Flags} +% The most important interface is for setting the flag which controls how the +% formulas should be converted. +% +% \begin{macro}{\luamml_flag_process:} +% Consider the current formula to be a complete, free-standing mathematical +% expression which should be converted to MathML. Additionally, the formula +% is also saved in the \texttt{start\_math} node as with +% \cs{luamml_flag_save:}. +% \begin{macrocode} +\cs_new:Npn \luamml_flag_process: { + \int_set:Nn \l__luamml_flag_int { 3 } +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\luamml_flag_save:, +% \luamml_flag_save:N, +% \luamml_flag_save:n, +% \luamml_flag_save:Nn} +% Convert the current formula but only save it's representation in the math +% node without emitting it as a complete formula. This is useful when the +% expression forms part of a bigger formula and will be intergrated into it's +% MathML tables later by special code. +% It optinally accepts two parameters: One math style command +% (\cs{displaystyle}, \cs{textstyle}, etc.) which is the implicit math style +% (so the style which the surrounding code expects this style to have) and a +% name for the root element (defaults to \texttt{mrow}). +% If the root element name is \texttt{mrow}, it will get suppressed in some +% cases. +% \begin{macrocode} +\cs_new:Npn \luamml_flag_save: { + \int_set:Nn \l__luamml_flag_int { 1 } +} +\cs_new:Npn \luamml_flag_save:N #1 { + \int_set:Nn \l__luamml_flag_int { 17 + 32 * #1 } +} +\cs_new:Npn \luamml_flag_save:n { + \int_set:Nn \l__luamml_flag_int { 5 } + \tl_set:Nn \l__luamml_root_tl +} +\cs_new:Npn \luamml_flag_save:Nn #1 { + \int_set:Nn \l__luamml_flag_int { 21 + 32 * #1 } + \tl_set:Nn \l__luamml_root_tl +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\luamml_flag_ignore:} +% Completely ignore the math mode material. +% \begin{macrocode} +\cs_new:Npn \luamml_flag_ignore: { + \int_set:Nn \l__luamml_flag_int { 0 } +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\luamml_flag_structelem:} +% Like \cs{luamml_flag_process:}, but additionally add PDF structure +% elements. This only works if \pkg{tagpdf} has been loaded \emph{before} +% \texttt{luamml}. +% \begin{macrocode} +\cs_new:Npn \luamml_flag_structelem: { + \int_set:Nn \l__luamml_flag_int { 11 } +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\luamml_set_filename:n} +% Allows to set a filename to which the generated MathML gets written. +% Previous content from the file will get overwritten. This includes results +% written by a previous formula. Therefore this has to be called separately +% for every formula or it must expand to different values to be useful. +% The value is fully expanded when the file is written. +% +% Only complete formulas get written into files (so formulas where +% \cs{luamml_flag_process:} or \cs{luamml_flag_structelem:} are in effect). +% \begin{macrocode} +\cs_new:Npn \luamml_set_filename:n { + \tl_set:Nn \l__luamml_filename_tl +} +% \end{macrocode} +% \end{macro} +% +% By default, the flag is set to assume complete formulas. +% \begin{macrocode} +\luamml_flag_process: +% \end{macrocode} +% +% \subsection{Annotations} +% \begin{macro}{\luamml_annotate:nen, \luamml_annotate:en} +% A simple annotation scheme: The first argument is the number of top level +% noads to be annotated, the second parameter the annotation and the third +% parameter the actual list of math tokens. The first argument can be omitted to +% let Lua\TeX detrmine the number itself. +% +% Passing the first parameter explicitly is useful for any annotations which +% should be compatible with fututre pdf\TeX versions of this functionality. +% \begin{macrocode} +\cs_new_protected:Npn \luamml_annotate:nen #1#2#3 { + \__luamml_annotate_begin: + #3 + \__luamml_annotate_end:we \tex_numexpr:D #1 \scan_stop: {#2} +} + +\cs_new_protected:Npn \luamml_annotate:en #1#2 { + \__luamml_annotate_begin: + #2 + \__luamml_annotate_end:e {#1} +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Patching} +% For some packages, we ship with patches to make them more compatible and to +% demonstrate how other code can be patched to work with \texttt{luamml}. +% +% These are either loaded directly if the packages are loaded or delayed using +% \LaTeX's hook system otherwise. +% \begin{macro}{\__luamml_patch_package:nn, \__luamml_patch_package:n} +% For this, we use two helpers: First a wrapper which runs arbitrary code either +% now (if the package is already loaded) or as soon as the package loads, second +% an application of the first one to load packages following \texttt{luamml}'s +% naming scheme for these patch packages. +% \begin{macrocode} +\cs_new:Npn \__luamml_patch_package:nn #1 #2 { + \@ifpackageloaded {#1} {#2} { + \hook_gput_code:nnn {package/after/#1} {luamml} {#2} + } +} +\cs_new:Npn \__luamml_patch_package:n #1 { + \__luamml_patch_package:nn {#1} { + \RequirePackage { luamml-patches-#1 } + } +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\RequirePackage { luamml-patches-kernel } +\__luamml_patch_package:n {amsmath} +\__luamml_patch_package:n {array} +% \end{macrocode} + +% \iffalse +% +% \fi +% \end{implementation} +% \Finale From 09b8344549844e0ce313d8ea678ef5b7c3c4e134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 22 Jun 2021 17:39:42 +0200 Subject: [PATCH 052/206] luamml.sty is now generated --- build.lua | 11 ++++----- luamml.sty | 65 ------------------------------------------------------ 2 files changed, 6 insertions(+), 70 deletions(-) delete mode 100644 luamml.sty diff --git a/build.lua b/build.lua index 7952989..f5e1bf1 100644 --- a/build.lua +++ b/build.lua @@ -1,8 +1,9 @@ module = "luamml" -typesetexe = "lualatex" -tdsroot = "lualatex" +tdsroot = "lualatex" installfiles = { "luamml-*.lua", "*.sty" } -stdengine = "luatex" -checkengines = {"luatex"} -sourcefiles = installfiles +sourcefiles = { "luamml-*.lua", "*.sty", "*.dtx" } +stdengine = "luatex" +checkengines = {"luatex"} +unpackfiles = { "*.dtx" } +typesetexe = "lualatex" diff --git a/luamml.sty b/luamml.sty deleted file mode 100644 index 76cb22f..0000000 --- a/luamml.sty +++ /dev/null @@ -1,65 +0,0 @@ -\ProvidesExplPackage {luamml} {2021-04-23} {0.0.1-alpha} - {Feel free to add a description here} - -\int_new:N \l__luamml_flag_int -\tl_new:N \l__luamml_filename_tl -\tl_new:N \l__luamml_root_tl -\tl_set:Nn \l__luamml_root_tl { mrow } -\int_new:N \tracingmathml -\lua_now:n { require'luamml-tex' } - -\cs_new:Npn \luamml_flag_process: { - \int_set:Nn \l__luamml_flag_int { 3 } -} -\cs_new:Npn \luamml_flag_save: { - \int_set:Nn \l__luamml_flag_int { 1 } -} -\cs_new:Npn \luamml_flag_save:N #1 { - \int_set:Nn \l__luamml_flag_int { 17 + 32 * #1 } -} -\cs_new:Npn \luamml_flag_save:Nn #1 { - \int_set:Nn \l__luamml_flag_int { 21 + 32 * #1 } - \tl_set:Nn \l__luamml_root_tl -} -\cs_new:Npn \luamml_flag_save:n { - \int_set:Nn \l__luamml_flag_int { 5 } - \tl_set:Nn \l__luamml_root_tl -} -\cs_new:Npn \luamml_flag_ignore: { - \int_set:Nn \l__luamml_flag_int { 0 } -} -\cs_new:Npn \luamml_flag_structelem: { - \int_set:Nn \l__luamml_flag_int { 11 } -} -\cs_new:Npn \luamml_set_filename:n { - \tl_set:Nn \l__luamml_filename_tl -} -\luamml_flag_process: - - -\cs_new_protected:Npn \luamml_annotate:nen #1#2#3 { - \__luamml_annotate_begin: - #3 - \__luamml_annotate_end:we \tex_numexpr:D #1 \scan_stop: {#2} -} - -\cs_new_protected:Npn \luamml_annotate:en #1#2 { - \__luamml_annotate_begin: - #2 - \__luamml_annotate_end:e {#1} -} - - -\cs_new:Npn \__luamml_patch_package:nn #1 #2 { - \@ifpackageloaded {#1} {#2} { - \hook_gput_code:nnn {package/after/#1} {luamml} {#2} - } -} -\cs_new:Npn \__luamml_patch_package:n #1 { - \__luamml_patch_package:nn {#1} { - \RequirePackage { luamml-patches-#1 } - } -} -\RequirePackage { luamml-patches-kernel } -\__luamml_patch_package:n {amsmath} -\__luamml_patch_package:n {array} From 3decacd0334ee1a6cba05fdc5f709e70881d96bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 22 Jun 2021 17:40:09 +0200 Subject: [PATCH 053/206] Apply some protection --- luamml.dtx | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/luamml.dtx b/luamml.dtx index 5cc917d..268b6a7 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -96,7 +96,7 @@ % is also saved in the \texttt{start\_math} node as with % \cs{luamml_flag_save:}. % \begin{macrocode} -\cs_new:Npn \luamml_flag_process: { +\cs_new_protected:Npn \luamml_flag_process: { \int_set:Nn \l__luamml_flag_int { 3 } } % \end{macrocode} @@ -117,17 +117,17 @@ % If the root element name is \texttt{mrow}, it will get suppressed in some % cases. % \begin{macrocode} -\cs_new:Npn \luamml_flag_save: { +\cs_new_protected:Npn \luamml_flag_save: { \int_set:Nn \l__luamml_flag_int { 1 } } -\cs_new:Npn \luamml_flag_save:N #1 { +\cs_new_protected:Npn \luamml_flag_save:N #1 { \int_set:Nn \l__luamml_flag_int { 17 + 32 * #1 } } -\cs_new:Npn \luamml_flag_save:n { +\cs_new_protected:Npn \luamml_flag_save:n { \int_set:Nn \l__luamml_flag_int { 5 } \tl_set:Nn \l__luamml_root_tl } -\cs_new:Npn \luamml_flag_save:Nn #1 { +\cs_new_protected:Npn \luamml_flag_save:Nn #1 { \int_set:Nn \l__luamml_flag_int { 21 + 32 * #1 } \tl_set:Nn \l__luamml_root_tl } @@ -137,7 +137,7 @@ % \begin{macro}{\luamml_flag_ignore:} % Completely ignore the math mode material. % \begin{macrocode} -\cs_new:Npn \luamml_flag_ignore: { +\cs_new_protected:Npn \luamml_flag_ignore: { \int_set:Nn \l__luamml_flag_int { 0 } } % \end{macrocode} @@ -148,7 +148,7 @@ % elements. This only works if \pkg{tagpdf} has been loaded \emph{before} % \texttt{luamml}. % \begin{macrocode} -\cs_new:Npn \luamml_flag_structelem: { +\cs_new_protected:Npn \luamml_flag_structelem: { \int_set:Nn \l__luamml_flag_int { 11 } } % \end{macrocode} @@ -164,7 +164,7 @@ % Only complete formulas get written into files (so formulas where % \cs{luamml_flag_process:} or \cs{luamml_flag_structelem:} are in effect). % \begin{macrocode} -\cs_new:Npn \luamml_set_filename:n { +\cs_new_protected:Npn \luamml_set_filename:n { \tl_set:Nn \l__luamml_filename_tl } % \end{macrocode} @@ -211,12 +211,12 @@ % an application of the first one to load packages following \texttt{luamml}'s % naming scheme for these patch packages. % \begin{macrocode} -\cs_new:Npn \__luamml_patch_package:nn #1 #2 { +\cs_new_protected:Npn \__luamml_patch_package:nn #1 #2 { \@ifpackageloaded {#1} {#2} { \hook_gput_code:nnn {package/after/#1} {luamml} {#2} } } -\cs_new:Npn \__luamml_patch_package:n #1 { +\cs_new_protected:Npn \__luamml_patch_package:n #1 { \__luamml_patch_package:nn {#1} { \RequirePackage { luamml-patches-#1 } } From ffe3514b7526ecd6026c22d4de1ddc048302b5c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 22 Jun 2021 17:44:18 +0200 Subject: [PATCH 054/206] Use new flag_save variants --- luamml-amsmath.lua | 4 ++-- luamml-kernel.lua | 15 ++------------- luamml-patches-amsmath.sty | 8 ++++---- luamml-patches-array.sty | 6 +++--- luamml-patches-kernel.sty | 4 ++-- luamml-table.lua | 18 ++++++++++-------- 6 files changed, 23 insertions(+), 32 deletions(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index 40da8c4..c3bfd80 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -22,7 +22,7 @@ lua.get_functions_table()[funcid] = function() until startmath == head or (startmath.id == math_t and startmath.subtype == 0) if startmath == head then return end assert(startmath.id == node.id"math") - store_column(startmath, true) + store_column(startmath) end local funcid = luatexbase.new_luafunction'__luamml_amsmath_add_box_to_row:' @@ -33,7 +33,7 @@ lua.get_functions_table()[funcid] = function() local boxnum = 0 local startmath = tex.box[boxnum].list assert(startmath.id == math_t) - store_column(startmath, true) + store_column(startmath) end do diff --git a/luamml-kernel.lua b/luamml-kernel.lua index 65b3efa..678fce1 100644 --- a/luamml-kernel.lua +++ b/luamml-kernel.lua @@ -3,12 +3,11 @@ local if_vertical = token.create'ifv@' local if_horizontal = token.create'ifh@' local iftrue_index = token.create'iftrue'.index -local funcid = luatexbase.new_luafunction'__luamml_kernel_finalize_phantom:N' -token.set_lua('__luamml_kernel_finalize_phantom:N', funcid, 'protected') +local funcid = luatexbase.new_luafunction'__luamml_kernel_finalize_phantom:' +token.set_lua('__luamml_kernel_finalize_phantom:', funcid, 'protected') lua.get_functions_table()[funcid] = function() -- TODO: Error handling etc -- At this point, box 0 contains the inner expression and the curent list ends with the noad whose nucleus should get replaced - local size = token.scan_int()//2 local boxnum = 0 local startmath = tex.box[boxnum].list assert(startmath.id == node.id"math") @@ -22,16 +21,6 @@ lua.get_functions_table()[funcid] = function() local saved_props = assert(properties[startmath]) local saved_core = saved_props.saved_mathml_core local saved = assert(saved_props.saved_mathml_table or saved_core) - if saved[0] == 'mstyle' - and (not saved.displaystyle or saved.displaystyle == (size == 0)) - and (not saved.scriptlevel or saved.scriptlevel == (size == 0 and 0 or size-1)) - then - saved[0], saved.displaystyle, saved.scriptlevel = 'mphantom', nil, nil - elseif saved[0] == 'mrow' then - saved[0] = 'mphantom' - else - saved = {[0] = 'mphantom', saved} - end -- The following could be optimized for the case that both if_vertical and if_horizontal -- are set, but that should't happen ayway and is just supported for consistency. if if_vertical.index ~= iftrue_index then diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 2de1036..6b01eeb 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -36,7 +36,7 @@ \m@th \displaystyle {##} - \luamml_flag_save:N \displaystyle + \luamml_flag_save:Nn \displaystyle {mtd} $ \__luamml_amsmath_add_last_to_row: \tabskip \z@skip @@ -48,7 +48,7 @@ {} ## } - \luamml_flag_save:N \displaystyle + \luamml_flag_save:Nn \displaystyle {mtd} $ \__luamml_amsmath_add_last_to_row: \hfil @@ -79,7 +79,7 @@ \ifmeasuring@ \luamml_flag_ignore: \else - \luamml_flag_save:N \displaystyle + \luamml_flag_save:Nn \displaystyle {mtd} \fi $ } @@ -103,7 +103,7 @@ \ifmeasuring@ \luamml_flag_ignore: \else - \luamml_flag_save:N \displaystyle + \luamml_flag_save:Nn \displaystyle {mtd} \fi $ } diff --git a/luamml-patches-array.sty b/luamml-patches-array.sty index 757b027..dc15a40 100644 --- a/luamml-patches-array.sty +++ b/luamml-patches-array.sty @@ -18,7 +18,7 @@ } { \__luamml_array_init_col: \insert@column - \luamml_flag_save: + \luamml_flag_save:n {mtd} \d@llarend \__luamml_array_finalize_col:w 0~ } @@ -33,7 +33,7 @@ } { \__luamml_array_init_col: \insert@column - \luamml_flag_save: + \luamml_flag_save:n {mtd} \d@llarend \__luamml_array_finalize_col:w 1~ } @@ -49,7 +49,7 @@ } { \__luamml_array_init_col: \insert@column - \luamml_flag_save: + \luamml_flag_save:n {mtd} \d@llarend \__luamml_array_finalize_col:w 2~ } diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index 5326917..bec471b 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -9,9 +9,9 @@ \m@th #1 {#2} - \luamml_flag_save: + \luamml_flag_save:Nn #1 {mphantom} $ } \finph@nt - \__luamml_kernel_finalize_phantom:N #1 + \__luamml_kernel_finalize_phantom: } diff --git a/luamml-table.lua b/luamml-table.lua index 340fb06..2e4aad9 100644 --- a/luamml-table.lua +++ b/luamml-table.lua @@ -20,23 +20,25 @@ local function store_get_row() end local function store_column_xml(mml, display) - if display and mml[0] == 'mstyle' and mml.displaystyle == true then - mml[0], mml.displaystyle, mml.scriptlevel = 'mtd', nil, nil - else - if display and mml[0] ~= 'mstyle' then - mml = {[0] = 'mstyle', displaystyle = false, mml} + if mml[0] ~= 'mtd' then + if display and mml[0] == 'mstyle' and mml.displaystyle == true then + mml[0], mml.displaystyle, mml.scriptlevel = 'mtd', nil, nil + else + if display and mml[0] ~= 'mstyle' then + mml = {[0] = 'mstyle', displaystyle = false, mml} + end + mml = {[0] = 'mtd', mml} end - mml = {[0] = 'mtd', mml} end table.insert(store_get_row(), mml) return mml end -local function store_column(startmath, display) +local function store_column(startmath) local props = properties[startmath] if not props then return end local mml = props.saved_mathml_table or props.saved_mathml_core - if mml then return store_column_xml(mml, display) end + if mml then return store_column_xml(mml) end end local function store_tag(xml) From 36b3c596a78ed56283ca4cd0286aaf6c09e0d3c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 22 Jun 2021 23:24:25 +0200 Subject: [PATCH 055/206] Add {gather} support --- luamml-patches-amsmath.sty | 66 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 6b01eeb..f2c9205 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -3,6 +3,12 @@ \lua_now:n { require'luamml-amsmath' } +% For all of these changes, the redefinitions appear huge. +% But they are almost identical to the original and only +% add luamml commands in appropriate places, so they would +% mostly disappear if there were enough hooks in amsmath. + +% aligned and friends \cs_set:Npn \start@aligned #1#2 { \RIfM@ \else @@ -66,6 +72,66 @@ \__luamml_amsmath_finalize_inner_table: } +% gather +\cs_set:Npn \gather@ #1 { + \ingather@true + \let \split \insplit@ + \let \tag \tag@in@align + \let \label \label@in@display + \chardef \dspbrk@context \z@ + \intertext@ \displ@y@ \Let@ + \let \math@cr@@@ \math@cr@@@gather + \gmeasure@ {#1} + \global \shifttag@false + \tabskip \z@skip + \global \row@ \@ne + \halign to \displaywidth \bgroup + \strut@ + \setboxz@h { + $ + \m@th + \displaystyle + {##} + \luamml_flag_save:Nn \displaystyle {mtd} + $ + } + \__luamml_amsmath_add_box_to_row: + \calc@shift@gather + \set@gather@field + \tabskip\@centering + & + \setboxz@h { + \strut@ + {##} + } + \place@tag@gather + \__luamml_amsmath_set_tag: + \tabskip \iftagsleft@ + \gdisplaywidth@ + \else + \z@skip + \span \fi + \crcr + #1 +} +\cs_new_eq:NN \__luamml_amsmath_original_gmeasure:n \gmeasure@ +\cs_set:Npn \gmeasure@ #1 { + \exp_last_unbraced:Nno + \use_ii_i:nn + { \luamml_flag_ignore: } + { \__luamml_amsmath_original_gmeasure:n {#1} } +} + +\cs_set:Npn \endgather { + \math@cr + \black@ \totwidth@ + \__luamml_amsmath_finalize_table: + \egroup + $$ + \ignorespacesafterend +} + +% align and friends \cs_set:Npn \align@preamble { & \hfil From 4005fc172da021ab3a4ec32f898d52daf1bf387e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 23 Jun 2021 04:39:58 +0200 Subject: [PATCH 056/206] gathered support --- luamml-amsmath.lua | 18 +++++++++------- luamml-patches-amsmath.sty | 43 ++++++++++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index c3bfd80..3ef4298 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -38,20 +38,21 @@ end do local saved - funcid = luatexbase.new_luafunction'__luamml_amsmath_save_inner_table:' - token.set_lua('__luamml_amsmath_save_inner_table:', funcid) + funcid = luatexbase.new_luafunction'__luamml_amsmath_save_inner_table:n' + token.set_lua('__luamml_amsmath_save_inner_table:n', funcid) lua.get_functions_table()[funcid] = function() -- TODO: Error handling etc + local kind = token.scan_argument() local mml_table = get_table() if not mml_table then return end mml_table.displaystyle = true local columns = node.count(node.id'align_record', tex.lists.align_head)//2 - mml_table.columnalign = string.rep('right left', columns, ' ') + mml_table.columnalign = kind == 'gathered' and 'center' or string.rep('right left', columns, ' ') local spacing = {} for n in node.traverse_id(node.id'glue', tex.lists.align_head) do spacing[#spacing+1] = n.width == 0 and '0' or string.format('%.3f', n.width/65781.76) end - mml_table.columnspacing = table.concat(spacing, ' ', 2, #spacing-2) + mml_table.columnspacing = #spacing > 3 and table.concat(spacing, ' ', 2, #spacing-2) or nil saved = mml_table end @@ -70,20 +71,21 @@ do end end -funcid = luatexbase.new_luafunction'__luamml_amsmath_finalize_table:' -token.set_lua('__luamml_amsmath_finalize_table:', funcid) +funcid = luatexbase.new_luafunction'__luamml_amsmath_finalize_table:n' +token.set_lua('__luamml_amsmath_finalize_table:n', funcid) lua.get_functions_table()[funcid] = function() -- TODO: Error handling etc + local kind = token.scan_argument() local mml_table = get_table() if not mml_table then return end mml_table.displaystyle = true local columns = node.count(node.id'align_record', tex.lists.align_head)//2 - mml_table.columnalign = string.rep('right left', columns, ' ') + mml_table.columnalign = kind == 'align' and string.rep('right left', columns, ' ') or nil local spacing = {} for n in node.traverse_id(node.id'glue', tex.lists.align_head) do spacing[#spacing+1] = n.width == 0 and '0' or '.8em' end - mml_table.columnspacing = table.concat(spacing, ' ', 2, #spacing-2) + mml_table.columnspacing = #spacing > 3 and table.concat(spacing, ' ', 2, #spacing-2) or nil save_result(mml_table, true) end diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index f2c9205..93d6a42 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -63,9 +63,39 @@ \ams@return@opt@arg } +\renewcommand \gathered [1] [c] { + \RIfM@ + \else + \nonmatherr@ { \begin {gathered} } + \fi + \luamml_annotate:en { + nucleus = true, core = false + } { + \alignedspace@left + } + \ams@start@box {#1} \bgroup + \Let@ + \chardef \dspbrk@context \@ne + \restore@math@cr + \spread@equation + \ialign \bgroup + \hfil + \strut@ + $ + \m@th + \displaystyle + ## + \luamml_flag_save:Nn \displaystyle {mtd} + $ + \__luamml_amsmath_add_last_to_row: + \hfil + \crcr + \ams@return@opt@arg +} + \cs_set:Npn \endaligned { \crcr - \__luamml_amsmath_save_inner_table: + \__luamml_amsmath_save_inner_table:n \@currenvir \egroup \restorecolumn@ \egroup @@ -104,8 +134,12 @@ \strut@ {##} } + \dim_compare:nNnF {0pt} = { + \box_wd:N \c_zero_int + } { + \__luamml_amsmath_set_tag: + } \place@tag@gather - \__luamml_amsmath_set_tag: \tabskip \iftagsleft@ \gdisplaywidth@ \else @@ -114,6 +148,7 @@ \crcr #1 } + \cs_new_eq:NN \__luamml_amsmath_original_gmeasure:n \gmeasure@ \cs_set:Npn \gmeasure@ #1 { \exp_last_unbraced:Nno @@ -125,7 +160,7 @@ \cs_set:Npn \endgather { \math@cr \black@ \totwidth@ - \__luamml_amsmath_finalize_table: + \__luamml_amsmath_finalize_table:n {gather} \egroup $$ \ignorespacesafterend @@ -223,7 +258,7 @@ \cs_set:Npn \endalign { \math@cr \black@ \totwidth@ - \__luamml_amsmath_finalize_table: + \__luamml_amsmath_finalize_table:n {align} \egroup \ifingather@ \restorealignstate@ From 3a8dcdebe82644843f54670c978c69cae95f0fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 23 Jun 2021 11:05:45 +0200 Subject: [PATCH 057/206] {multline} support (without labels on the left) --- luamml-amsmath.lua | 8 ++++ luamml-patches-amsmath.sty | 77 ++++++++++++++++++++++++++++++++++++++ luamml-table.lua | 23 +++++++++++- 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index 3ef4298..32b4d79 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -4,6 +4,7 @@ local save_result = require'luamml-tex'.save_result local store_column = require'luamml-table'.store_column local store_tag = require'luamml-table'.store_tag local get_table = require'luamml-table'.get_table +local set_row_attribute = require'luamml-table'.set_row_attribute local to_text = require'luamml-lr' local properties = node.get_properties_table() @@ -36,6 +37,12 @@ lua.get_functions_table()[funcid] = function() store_column(startmath) end +local funcid = luatexbase.new_luafunction'__luamml_amsmath_set_row_columnalign:n' +token.set_lua('__luamml_amsmath_set_row_columnalign:n', funcid, 'protected') +lua.get_functions_table()[funcid] = function() + set_row_attribute('columnalign', token.scan_argument()) +end + do local saved funcid = luatexbase.new_luafunction'__luamml_amsmath_save_inner_table:n' @@ -81,6 +88,7 @@ lua.get_functions_table()[funcid] = function() mml_table.displaystyle = true local columns = node.count(node.id'align_record', tex.lists.align_head)//2 mml_table.columnalign = kind == 'align' and string.rep('right left', columns, ' ') or nil + mml_table.width = kind == 'multline' and '100%' or nil local spacing = {} for n in node.traverse_id(node.id'glue', tex.lists.align_head) do spacing[#spacing+1] = n.width == 0 and '0' or '.8em' diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 93d6a42..f25da9b 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -271,6 +271,83 @@ \ignorespacesafterend } +% For a more interesting one, let's consider multline: +\cs_new_eq:NN \__luamml_amsmath_original_multline:n \multline@ +\cs_set:Npn \multline@ #1 { + \__luamml_amsmath_original_multline:n { + \ifmeasuring@ \else + \__luamml_amsmath_set_row_columnalign:n {left} + \fi + #1 + \ifmeasuring@ \else + \__luamml_amsmath_set_row_columnalign:n {right} + \fi + } +} + +\cs_new_eq:NN \__luamml_amsmath_original_mmeasure:n \mmeasure@ +\cs_set:Npn \mmeasure@ #1 { + \exp_last_unbraced:Nno + \use_ii_i:nn + { \luamml_flag_ignore: } + { \__luamml_amsmath_original_mmeasure:n {#1} } +} + +% Luckily, {multline} uses \endmultline@math in exactly +% the spot where we have to set the flag. +% Less luckily, \endmultline@math sometimes get overwritten for the last line. +% But that isn't a problem since we want special behavior there anyway. +\cs_set:Npn \endmultline@math { + \luamml_flag_save:Nn \displaystyle {mtd} + $ + \__luamml_amsmath_add_last_to_row: +} + +\cs_set:Npn \rendmultline@ { + \iftag@ + \luamml_flag_save:Nn \displaystyle {mtd} + $ + \__luamml_amsmath_add_last_to_row: + \let \endmultline@math \relax + \ifshifttag@ + \hskip \multlinegap + \llap { + \vtop { + \raise@tag + \normalbaselines + \setbox \@ne \null + \dp \@ne \lineht@ + \box \@ne + \hbox { + \strut@ + \make@display@tag + } + } + } + \else + \hskip \multlinetaggap + \make@display@tag + \fi + \__luamml_amsmath_set_tag: + \else + \hskip \multlinegap + \fi + \hfilneg + \math@cr + \__luamml_amsmath_finalize_table:n {multline} + \egroup + $$ +} + +\cs_set:Npn \lendmultline@ { + \hfilneg + \hskip\multlinegap + \math@cr + \__luamml_amsmath_finalize_table:n {multline} + \egroup + $$ +} + \cs_set:Npn \bBigg@ #1 #2 { { \ensuremath { diff --git a/luamml-table.lua b/luamml-table.lua index 2e4aad9..8b70395 100644 --- a/luamml-table.lua +++ b/luamml-table.lua @@ -4,8 +4,23 @@ local save_result = require'luamml-tex'.save_result local properties = node.get_properties_table() +local glue_id = node.id'glue' +local tabskip_sub = 12 +assert(node.subtypes'glue'[tabskip_sub] == 'tabskip') + local function store_get_row() - local row_temp = tex.nest[tex.nest.ptr-1].head + local row_temp + for i=tex.nest.ptr-1, 0, -1 do + local head = tex.nest[i].head + local glue = head.next + if glue and glue.id == glue_id and glue.subtype == tabskip_sub then + row_temp = head + break + end + end + if not row_temp then + error[[luamml_table's store function called outside of table]] + end local props = properties[row_temp] if not props then props = {} @@ -48,6 +63,11 @@ local function store_tag(xml) last_tag = nil end +local function set_row_attribute(name, value) + local mml_row = store_get_row() + mml_row[name] = value +end + luatexbase.add_to_callback('hpack_filter', function(_, group) if group ~= 'fin_row' then return true end @@ -85,5 +105,6 @@ return { store_column = store_column, store_column_xml = store_column_xml, store_tag = store_tag, + set_row_attribute = set_row_attribute, get_table = get_table, } From 75c92b1ff58ec79cc8269d3783c3dabf0d704ba0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 23 Jun 2021 14:35:43 +0200 Subject: [PATCH 058/206] Much better structelem support --- luamml-amsmath.lua | 1 + luamml-convert.lua | 17 +++++++++++++---- luamml-structelemwriter.lua | 35 ++++++++++++++++++++++++----------- luamml-tex.lua | 15 ++++++++------- luamml.dtx | 21 +++++++++++++++++---- 5 files changed, 63 insertions(+), 26 deletions(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index 32b4d79..1175481 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -89,6 +89,7 @@ lua.get_functions_table()[funcid] = function() local columns = node.count(node.id'align_record', tex.lists.align_head)//2 mml_table.columnalign = kind == 'align' and string.rep('right left', columns, ' ') or nil mml_table.width = kind == 'multline' and '100%' or nil + -- mml_table.side = kind == 'multline' and 'rightoverlap' or nil local spacing = {} for n in node.traverse_id(node.id'glue', tex.lists.align_head) do spacing[#spacing+1] = n.width == 0 and '0' or '.8em' diff --git a/luamml-convert.lua b/luamml-convert.lua index 1af5e24..1cbcd6b 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -139,7 +139,7 @@ local function delim_to_table(delim) else local fam = delim.small_fam char = remap_lookup[fam << 21 | char] - local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = not stretchy[char] or nil, lspace = 0, rspace = 0, [':node'] = delim } + local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = not stretchy[char] or nil, lspace = 0, rspace = 0, [':nodes'] = {delim} } if mathml_filter then return mathml_filter(result, result) else @@ -166,7 +166,7 @@ local function acc_to_table(acc, cur_style, stretch) if stretch ~= not stretchy[char] then -- Handle nil gracefully in stretchy stretch = nil end - local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = stretch, [':node'] = acc} + local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = stretch, [':nodes'] = {acc}} if mathml_filter then return mathml_filter(result) else @@ -190,7 +190,7 @@ local function kernel_to_table(kernel, cur_style) char, ['tex:family'] = fam ~= 0 and fam or nil, mathvariant = utf8.len(char) == 1 and elem == 'mi' and utf8.codepoint(char) < 0x10000 and 'normal' or nil, - [':node'] = kernel, + [':nodes'] = {kernel}, } if mathml_filter then return mathml_filter(result, result) @@ -202,7 +202,7 @@ local function kernel_to_table(kernel, cur_style) if kernel.list.id == hlist_t then -- We directly give up for vlists result = to_text(kernel.list.head) else - result = {[0] = 'mi', {[0] = 'mglyph', ['tex:box'] = kernel.list, [':node'] = kernel}} + result = {[0] = 'mi', {[0] = 'mglyph', ['tex:box'] = kernel.list, [':nodes'] = {kernel}}} end if mathml_filter then return mathml_filter(result, result) @@ -272,6 +272,15 @@ local function noad_to_table(noad, sub, cur_style, joining) or core[0] == 'mn' or text_families[core['tex:family']] then if joining and core[0] == joining[0] and core['tex:family'] == joining['tex:family'] then joining[#joining+1] = core[1] + local cnodes = core[':nodes'] + if cnodes then -- very likely + local jnodes = joining[':nodes'] + if jnodes then -- very likely + table.move(cnodes, 1, #cnodes, #jnodes+1, jnodes) + else + joining[':nodes'] = cnodes + end + end nucleus = do_sub_sup(joining, joining, noad, cur_style) if nucleus == joining then return nil, joining, joining diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index 56f99d3..8b766bd 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -39,8 +39,9 @@ local mc_type = token.create'l__tag_mc_type_attr'.index local mc_cnt = token.create'l__tag_mc_cnt_attr'.index -- print('!!!', mc_type, mc_cnt) +local stash_cnt = 0 local attrs = {} -local function write_elem(tree, indent) +local function write_elem(tree, stash) if tree[':struct'] then return tex.runtoks(function() return tex.sprint(struct_use, '{', tree[':struct'], '}') @@ -54,22 +55,34 @@ local function write_elem(tree, indent) attrs[i] = string.format('/%s(%s)', escape_name(attr), escape_string(val)) end end table.sort(attrs) - local attr_name - if i == 0 then - tex.sprint(struct_begin, '{tag=', tree[0], '/mathml}') + + if stash then + stash_cnt = stash_cnt + 1 + stash = '__luamml_stashed_' .. stash_cnt + tree[':struct'] = stash + stash = ', stash, label = ' .. stash else - tex.sprint(struct_begin, '{tag=', tree[0], '/mathml,attribute=', attributes[table.concat(attrs)], '}') + stash = '' + end + + if i == 0 then + tex.sprint(struct_begin, '{tag=' .. tree[0] .. '/mathml' .. stash .. '}') + else + tex.sprint(struct_begin, '{tag=' .. tree[0] .. '/mathml, attribute=' .. attributes[table.concat(attrs)] .. stash .. '}') end for j = 1, i do attrs[j] = nil end - if tree[':node'] then - local n = tree[':node'] + if tree[':nodes'] then + local n = tree[':nodes'] tex.runtoks(function() tex.sprint{mc_begin, string.format('{tag=%s}', tree[0])} -- NOTE: This will also flush all previous sprint's... That's often annoying, but in this case actually intentional. end) - node.set_attribute(tree[':node'], mc_type, tex.attribute[mc_type]) - node.set_attribute(tree[':node'], mc_cnt, tex.attribute[mc_cnt]) + local mct, mcc = tex.attribute[mc_type], tex.attribute[mc_cnt] + for i = 1, #n do + node.set_attribute(n[i], mc_type, mct) + node.set_attribute(n[i], mc_cnt, mcc) + end tex.runtoks(function() tex.sprint(mc_end) end) @@ -84,6 +97,6 @@ local function write_elem(tree, indent) end) end -return function(element) - return write_elem(element) +return function(element, stash) + return write_elem(element, stash) end diff --git a/luamml-tex.lua b/luamml-tex.lua index 2581a7c..46535d6 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -83,6 +83,9 @@ local function save_result(xml, display, structelem) if tracing then texio.write_nl(write_xml(mlist_result) .. '\n') end + if tex.count.l__luamml_flag_int & 8 == 8 then + write_struct(mlist_result) + end return mlist_result end @@ -95,11 +98,11 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) return true end local display = style == 'display' + local startmath = tex.nest.top.tail -- Must come before any write_struct calls which adds nodes style = flag & 4 == 4 and flag>>5 & 0x7 or display and 0 or 2 local xml, core = process_mlist(mlist, style) - local processed_xml if flag & 2 == 2 then - processed_xml = save_result(shallow_copy(xml), display) + save_result(shallow_copy(xml), display) else local element_type = token.get_macro'l__luamml_root_tl' if element_type ~= 'mrow' then @@ -109,19 +112,17 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) xml = {[0] = element_type, xml} end end - processed_xml = xml end if not display and flag & 1 == 1 then - local startmath = tex.nest.top.tail local props = properties[startmath] if not props then props = {} properties[startmath] = props end props.saved_mathml_table, props.saved_mathml_core = xml, core - end - if flag & 8 == 8 then - write_struct(shallow_copy(processed_xml), display and 0 or 2) + if flag & 10 == 8 then + write_struct(xml, true) -- This modifies xml in-place to reference the struture element + end end return true end, 'dump_list') diff --git a/luamml.dtx b/luamml.dtx index 268b6a7..520f033 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -102,6 +102,19 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\__luamml_maybe_structelem:} +% A internal helper which can be added to a tag to preserve the external state +% of the structelem flag. +% \begin{macrocode} +\cs_new:Npn \__luamml_maybe_structelem: { + ( + 8 * \int_mod:nn { + \int_div_truncate:nn { \l__luamml_flag_int } {8} + } {2} + ) + +} +% \end{macro} +% % \begin{macro}{\luamml_flag_save:, % \luamml_flag_save:N, % \luamml_flag_save:n, @@ -118,17 +131,17 @@ % cases. % \begin{macrocode} \cs_new_protected:Npn \luamml_flag_save: { - \int_set:Nn \l__luamml_flag_int { 1 } + \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 1 } } \cs_new_protected:Npn \luamml_flag_save:N #1 { - \int_set:Nn \l__luamml_flag_int { 17 + 32 * #1 } + \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 17 + 32 * #1 } } \cs_new_protected:Npn \luamml_flag_save:n { - \int_set:Nn \l__luamml_flag_int { 5 } + \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 5 } \tl_set:Nn \l__luamml_root_tl } \cs_new_protected:Npn \luamml_flag_save:Nn #1 { - \int_set:Nn \l__luamml_flag_int { 21 + 32 * #1 } + \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 21 + 32 * #1 } \tl_set:Nn \l__luamml_root_tl } % \end{macrocode} From 75ede91b5db6e7a9cd4221ae3ffdb3aa8f59cec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 23 Jun 2021 15:48:56 +0200 Subject: [PATCH 059/206] Smaller improvements --- luamml-convert.lua | 4 ++-- luamml-demo.sty | 12 ++++++++++-- luamml-structelemwriter.lua | 15 +++++++++------ 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index 1cbcd6b..b7ca08b 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -139,7 +139,7 @@ local function delim_to_table(delim) else local fam = delim.small_fam char = remap_lookup[fam << 21 | char] - local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = not stretchy[char] or nil, lspace = 0, rspace = 0, [':nodes'] = {delim} } + local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = not stretchy[char] or nil, lspace = 0, rspace = 0, [':nodes'] = {delim}, [':actual'] = char} if mathml_filter then return mathml_filter(result, result) else @@ -166,7 +166,7 @@ local function acc_to_table(acc, cur_style, stretch) if stretch ~= not stretchy[char] then -- Handle nil gracefully in stretchy stretch = nil end - local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = stretch, [':nodes'] = {acc}} + local result = {[0] = 'mo', char, ['tex:family'] = fam ~= 0 and fam or nil, stretchy = stretch, [':nodes'] = {acc}, [':actual'] = stretch and char or nil} if mathml_filter then return mathml_filter(result) else diff --git a/luamml-demo.sty b/luamml-demo.sty index 3667e60..08748d3 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -13,10 +13,14 @@ } \ExplSyntaxOn + +\bool_new:N \l__luamml_demo_structelem_bool + \DeclareOption{tracing}{ \tracingmathml=2 } \DeclareOption{structelem}{ + \bool_set_true:N \l__luamml_demo_structelem_bool \luamml_flag_structelem: } \DeclareOption{files}{ @@ -36,7 +40,9 @@ \int_gincr:N \g__luamml_demo_af_int \exp_args:Ne \pdf_object_new:nn{__luamml_demo_\int_use:N \g__luamml_demo_af_int}{dict} \exp_args:Ne \tagstructbegin{tag=Formula,AF=__luamml_demo_\int_use:N \g__luamml_demo_af_int,#1} - \tagmcbegin{tag=Formula} + \bool_if:NF \l__luamml_demo_structelem_bool { + \tagmcbegin{tag=Formula} + } #2 \group_begin: \pdfdict_put:nnn {l_pdffile/Filespec} {AFRelationship}{/Supplement} @@ -45,7 +51,9 @@ { test.xml } { \luamml_get_last_mathml_stream:e{}\c_space_tl 0~R} \group_end: - \tagmcend + \bool_if:NF \l__luamml_demo_structelem_bool { + \tagmcend + } \tagstructend } diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index 8b766bd..bd0a59f 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -61,15 +61,18 @@ local function write_elem(tree, stash) stash = '__luamml_stashed_' .. stash_cnt tree[':struct'] = stash stash = ', stash, label = ' .. stash - else - stash = '' end - if i == 0 then - tex.sprint(struct_begin, '{tag=' .. tree[0] .. '/mathml' .. stash .. '}') - else - tex.sprint(struct_begin, '{tag=' .. tree[0] .. '/mathml, attribute=' .. attributes[table.concat(attrs)] .. stash .. '}') + local attr_flag = i ~= 0 and ', attribute=' .. attributes[table.concat(attrs)] + tex.sprint(struct_begin, '{tag=' .. tree[0] .. '/mathml') + if stash then tex.sprint(stash) end + if attr_flag then tex.sprint(attr_flag) end + if tree[':actual'] then + tex.sprint(', actualtext = {') + tex.cprint(12, tree[':actual']) + tex.sprint'}' end + tex.sprint'}' for j = 1, i do attrs[j] = nil end if tree[':nodes'] then From ccedfba57a6ddce621aaaeeead9bff2ce691bd03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 23 Jun 2021 18:48:30 +0200 Subject: [PATCH 060/206] Fix XML writer --- luamml-xmlwriter.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/luamml-xmlwriter.lua b/luamml-xmlwriter.lua index 38884ba..271fb07 100644 --- a/luamml-xmlwriter.lua +++ b/luamml-xmlwriter.lua @@ -30,14 +30,17 @@ local function write_elem(tree, indent) end out = out .. '>' local inner_indent = indent and indent .. ' ' + local is_string for _, elem in ipairs(tree) do if type(elem) == 'string' then - if inner_indent then + if inner_indent and not is_string then out = out .. inner_indent end out = out .. escape_text(elem) + is_string = true else out = out .. write_elem(elem, inner_indent) + is_string = nil end end if indent then out = out .. indent end From 77b607e2e2b828147810acf7354754ac77feae03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 23 Jun 2021 18:49:13 +0200 Subject: [PATCH 061/206] Generate nested in --- luamml-lr.lua | 53 +++++++++++++------------------------------------- luamml-tex.lua | 2 +- 2 files changed, 14 insertions(+), 41 deletions(-) diff --git a/luamml-lr.lua b/luamml-lr.lua index d0cbc55..b78a7c3 100644 --- a/luamml-lr.lua +++ b/luamml-lr.lua @@ -1,7 +1,7 @@ local properties = node.get_properties_table() local function to_unicode(head, tail) - local result, subresult, i = {[0] = 'mrow'}, {}, 0 + local result, subresult, i = {[0] = 'mtext'}, {}, 0 local characters, last_fid local iter, state, n = node.traverse(head) while true do @@ -10,7 +10,7 @@ local function to_unicode(head, tail) local props = properties[n] if props and props.glyph_info then i = i+1 - subresult[i] = glyph_info + result[i] = glyph_info else local char, fid = node.is_glyph(n) if char then @@ -23,27 +23,23 @@ local function to_unicode(head, tail) i = i+1 if uni then if type(uni) == 'number' then - subresult[i] = utf.char(uni) + result[i] = utf.char(uni) else - subresult[i] = utf.char(table.unpack(uni)) + result[i] = utf.char(table.unpack(uni)) end else if char < 0x110000 then - subresult[i] = utf.char(char) + result[i] = utf.char(char) else - subresult[i] = '\u{FFFD}' + result[i] = '\u{FFFD}' end end elseif node.id'math' == id then if props then local mml = props.saved_mathml_table or props.saved_mathml_core if mml then - if i ~= 0 then - result[#result+1] = {[0] = 'mtext', table.concat(subresult)} - for j = i, 1, -1 do subresult[j] = nil end - i = 0 - end - result[#result+1] = mml + i = i+1 + result[i] = mml n = node.end_of_math(n) end end @@ -52,46 +48,23 @@ local function to_unicode(head, tail) elseif node.id'glue' == id then if n.width > 1000 then -- FIXME: Coordinate constant with tagpdf i = i+1 - subresult[i] = '\u{00A0}' -- non breaking space... There is no real reason why it has to be non breaking, except that MathML often ignore other spaces + result[i] = '\u{00A0}' -- non breaking space... There is no real reason why it has to be non breaking, except that MathML often ignore other spaces end elseif node.id'hlist' == id then local nested = to_unicode(n.head) - if nested[0] == 'mtext' and #nested == 1 and type(nested[1]) == 'string' then - i=i+1 - subresult[i] = nested[1] - else - if i ~= 0 then - result[#result+1] = {[0] = 'mtext', table.concat(subresult)} - for j = i, 1, -1 do subresult[j] = nil end - i = 0 - end - if nested[0] == 'mrow' then - table.move(nested, 1, #nested, #result+1, result) - else -- should be unreachable (propbably actually is reachable if the inner list only contains math - result[#result+1] = nested - end - end + table.move(nested, 1, #nested, i+1, result) + i = i+#nested elseif node.id'vlist' == id then i = i+1 - subresult[i] = '\u{FFFD}' + result[i] = '\u{FFFD}' elseif node.id'rule' == id then if n.width ~= 0 then i = i+1 - subresult[i] = '\u{FFFD}' + result[i] = '\u{FFFD}' end end -- CHECK: Everything else can probably be ignored, otherwise shout at me end end - if i ~= 0 then - result[#result+1] = {[0] = 'mtext', table.concat(subresult)} - end - if #result == 0 then - local r = {[0] = 'mtext', ''} - return r, r - elseif #result == 1 then - result = result[1] - if result[1] == 'mtext' then return result, result end - end return result end diff --git a/luamml-tex.lua b/luamml-tex.lua index 46535d6..f8ed7a3 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -102,7 +102,7 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) style = flag & 4 == 4 and flag>>5 & 0x7 or display and 0 or 2 local xml, core = process_mlist(mlist, style) if flag & 2 == 2 then - save_result(shallow_copy(xml), display) + xml = save_result(shallow_copy(xml), display) else local element_type = token.get_macro'l__luamml_root_tl' if element_type ~= 'mrow' then From d4c6d493d2701219260d164e5852d248adad1b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 25 Jun 2021 04:21:21 +0200 Subject: [PATCH 062/206] Small fixes --- luamml-amsmath.lua | 2 +- luamml-patches-amsmath.sty | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index 1175481..d4f24aa 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -57,7 +57,7 @@ do mml_table.columnalign = kind == 'gathered' and 'center' or string.rep('right left', columns, ' ') local spacing = {} for n in node.traverse_id(node.id'glue', tex.lists.align_head) do - spacing[#spacing+1] = n.width == 0 and '0' or string.format('%.3f', n.width/65781.76) + spacing[#spacing+1] = n.width == 0 and '0' or string.format('%.3fpt', n.width/65781.76) end mml_table.columnspacing = #spacing > 3 and table.concat(spacing, ' ', 2, #spacing-2) or nil saved = mml_table diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index f25da9b..df40dab 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -16,7 +16,7 @@ \fi \savecolumn@ % Assumption: called inside a group \luamml_annotate:en { - nucleus = true, core = false + core = false } { \alignedspace@left } @@ -69,7 +69,7 @@ \nonmatherr@ { \begin {gathered} } \fi \luamml_annotate:en { - nucleus = true, core = false + core = false } { \alignedspace@left } From cb5def2cb10e3e0116759f74630f67f8bf87dbfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 25 Jun 2021 04:21:48 +0200 Subject: [PATCH 063/206] {smallmatrix} --- luamml-amsmath.lua | 13 ++++++++++ luamml-patches-amsmath.sty | 51 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index d4f24aa..2b74265 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -63,6 +63,19 @@ do saved = mml_table end + funcid = luatexbase.new_luafunction'__luamml_amsmath_save_smallmatrix:' + token.set_lua('__luamml_amsmath_save_smallmatrix:', funcid) + lua.get_functions_table()[funcid] = function() + -- TODO: Error handling etc + local mml_table = get_table() + mml_table.align = 'axis' + mml_table.columnalign = 'center' + mml_table.columnspacing = '0.278em' + mml_table.rowspacing = string.format('%.3fpt', tex.lineskip.width/65781.76) + saved = {[0] = 'mpadded', width = '+0.333em', lspace = '0.167em', mml_table} + saved = mml_table + end + funcid = luatexbase.new_luafunction'__luamml_amsmath_finalize_inner_table:' token.set_lua('__luamml_amsmath_finalize_inner_table:', funcid) lua.get_functions_table()[funcid] = function() diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index df40dab..7e8ced2 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -348,6 +348,57 @@ $$ } +% Finally some slightly different stuff. +% While {matrix} is covered by {array}, we still have {smallmatrix}: +\renewenvironment {smallmatrix} { + \luamml_annotate:en { + core = false + } { + \null + \, + } + \vcenter \bgroup + \Let@ + \restore@math@cr + \default@tag + \baselineskip 6 \ex@ + \lineskip 1.5 \ex@ + \lineskiplimit \lineskip + \ialign \bgroup + \hfil + $ + \m@th + \scriptstyle + ## + \luamml_flag_save:n {mtd} % No \scriptsize here since we want to add the mstyle nodes + $ + \__luamml_amsmath_add_last_to_row: + \hfil + && + \thickspace + \hfil + $ + \m@th + \scriptstyle + ## + \luamml_flag_save:n {mtd} % No \scriptsize here since we want to add the mstyle nodes + $ + \__luamml_amsmath_add_last_to_row: + \hfil + \crcr +}{% + \crcr + \__luamml_amsmath_save_smallmatrix: + \egroup + \egroup + \__luamml_amsmath_finalize_inner_table: + \luamml_annotate:en { + core = false + } { + \, + } +} + \cs_set:Npn \bBigg@ #1 #2 { { \ensuremath { From f5acbf0ab4cd0751b7fc855e773ef0e1e76049d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 26 Jun 2021 05:15:58 +0200 Subject: [PATCH 064/206] Some mathord elements are operators --- luamml-convert.lua | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index b7ca08b..b67cf12 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -104,6 +104,11 @@ local digit_map = {["0"] = true, ["1"] = true, ["5"] = true, ["6"] = true, ["7"] = true, ["8"] = true, ["9"] = true,} +local always_mo = {["%"] = true, ["&"] = true, ["."] = true, ["/"] = true, + ["\\"] = true, ["ยฌ"] = true, ["โ€ฒ"] = true, ["โ€ณ"] = true, ["โ€ด"] = true, + ["โ—"] = true, ["โ€ต"] = true, ["โ€ถ"] = true, ["โ€ท"] = true, ["|"] = true, + ["โˆ€"] = true, ["โˆ"] = true, ["โˆƒ"] = true, ["โˆ‚"] = true, ["โˆ„"] = true,} + -- Marker tables replacing the core operator for space like elements local space_like = {} @@ -251,14 +256,14 @@ local function maybe_to_mn(noad, core) core[0] = 'mn' end -local function noad_to_table(noad, sub, cur_style, joining) +local function noad_to_table(noad, sub, cur_style, joining, bin_replacements) local nucleus, core = kernel_to_table(noad.nucleus, sub == noad_over and cur_style//2*2+1 or cur_style) if not nucleus then return end if core and core[0] == 'mo' and core.minsize and not core.maxsize then core.maxsize = core.minsize -- This happens when a half-specified delimiter appears alone in a list. -- If it has a minimal size, it should be fixed to that size (since there is nothing bigger in it's list) end - if sub == noad_ord then + if sub == noad_ord and not (bin_replacements[node.direct.todirect(noad)] or (nucleus == core and #core == 1 and always_mo[core[1]])) then if core and core[0] == 'mo' then core['tex:class'] = nil if not core.minsize then @@ -293,7 +298,7 @@ local function noad_to_table(noad, sub, cur_style, joining) end end elseif sub == noad_op or sub == noad_oplimits or sub == noad_opnolimits or sub == noad_bin or sub == noad_rel or sub == noad_open - or sub == noad_close or sub == noad_punct or sub == noad_inner then + or sub == noad_close or sub == noad_punct or sub == noad_inner or sub == noad_ord then if not core or not core[0] then -- TODO else @@ -471,6 +476,7 @@ end -- The only part which changes the nodelist, we are converting bin into ord -- nodes in the same way TeX would do it later anyway. local function cleanup_mathbin(head) + local replacements = {} local last = 'open' -- last sub if id was noad_t, left fence acts fakes being a open noad, bin are themselves. Every other noad is ord for n, id, sub in node.traverse(head) do if id == noad_t then @@ -478,6 +484,7 @@ local function cleanup_mathbin(head) if node.is_node(last) or last == noad_opdisplaylimits or last == noad_oplimits or last == noad_opnolimits or last == noad_rel or last == noad_open or last == noad_punct then + replacements[node.direct.todirect(n)] = true n.subtype, last = noad_ord, noad_ord else last = n @@ -485,6 +492,7 @@ local function cleanup_mathbin(head) else if (sub == noad_rel or sub == noad_close or sub == noad_punct) and node.is_node(last) then + replacements[node.direct.todirect(last)] = true last.subtype = noad_ord end last = sub @@ -494,6 +502,7 @@ local function cleanup_mathbin(head) last = noad_open else if node.is_node(last) then + replacements[node.direct.todirect(last)] = true last.subtype = noad_ord, noad_ord end last = noad_ord @@ -503,12 +512,14 @@ local function cleanup_mathbin(head) end end if node.is_node(last) then + replacements[node.direct.todirect(last)] = true last.subtype = noad_ord end + return replacements end function nodes_to_table(head, cur_style) - cleanup_mathbin(head) + local bin_replacements = cleanup_mathbin(head) local t = {[0] = 'mrow'} local result = t local nonscript @@ -522,7 +533,7 @@ function nodes_to_table(head, cur_style) new_node, new_core = mathml_table, mathml_core elseif id == noad_t then local new_n - new_n, new_core, new_joining = noad_to_table(n, sub, cur_style, joining) + new_n, new_core, new_joining = noad_to_table(n, sub, cur_style, joining, bin_replacements) if new_joining == false then t[#t], new_joining = new_n, nil else From 903480a3f95d05f985b6df1b8114f57112979ae2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 26 Jun 2021 19:49:28 +0200 Subject: [PATCH 065/206] Prepare for better pdfTeX support --- luamml-pdf.sty | 1 + pdfmml-emulate-node.lua | 3 +++ pdfmml-logreader.lua | 6 ++++-- pdfmml.lua | 45 ++++++++++++++++++++++++++++++++--------- test_pdf.tex | 4 ++-- 5 files changed, 46 insertions(+), 13 deletions(-) diff --git a/luamml-pdf.sty b/luamml-pdf.sty index 50ba948..83ebda8 100644 --- a/luamml-pdf.sty +++ b/luamml-pdf.sty @@ -33,6 +33,7 @@ \iow_now:Nx \l__luamml_pdf_stream { LUAMML_FORMULA_BEGIN: \int_use:N \g__luamml_formula_id_int + :3:mrow } \__luamml_pdf_showlists: \iow_now:Nx \l__luamml_pdf_stream { diff --git a/pdfmml-emulate-node.lua b/pdfmml-emulate-node.lua index c7f6135..e2209ca 100644 --- a/pdfmml-emulate-node.lua +++ b/pdfmml-emulate-node.lua @@ -32,5 +32,8 @@ node = { traverse = function(head) return traverse_iter, head, nil end, + direct = { + todirect = function(n) return n end, + }, } tex.nulldelimiterspace = tex.nulldelimiterspace or 78643 -- 1.2pt diff --git a/pdfmml-logreader.lua b/pdfmml-logreader.lua index 8aa7bdd..a17f604 100644 --- a/pdfmml-logreader.lua +++ b/pdfmml-logreader.lua @@ -7,8 +7,10 @@ local non_final_list_block = (l.C((1-l.P'\n')^1) * '\n' - '### ' + '\n')^0 local math_lists_block = l.Ct('### ' * l.Cg(l.C'display' * ' ', 'display')^-1 * 'math mode entered at line ' * l.Cg(l.R'09'^1 / tonumber, 'line') * '\n' * non_final_list_block)^1 local generic_list_block = '### ' * (line - 'current page:') * non_final_list_block -local luamml_block = l.Cg('LUAMML_FORMULA_BEGIN:' * id * l.P'\n'^1 * l.Ct( - (math_lists_block + generic_list_block/0)^0 +local luamml_block = l.Cg('LUAMML_FORMULA_BEGIN:' * id * ':' * l.Ct( + l.Cg(id, 'flag') * ':' * l.Cg((1-l.P'\n')^0, 'tag') * l.P'\n'^1 + + * (math_lists_block + generic_list_block/0)^0 * (line - 'LUAMML_FORMULA_END\n')^0 * 'LUAMML_FORMULA_END\n') * l.Cc'groups') diff --git a/pdfmml.lua b/pdfmml.lua index 08d5d0b..116a617 100755 --- a/pdfmml.lua +++ b/pdfmml.lua @@ -52,13 +52,40 @@ else out_stream = assert(io.open(arg[2], 'w')) end end -for i, block in ipairs(parsed.groups) do - local stream = out_stream or assert(io.open(out_prefix .. tostring(i) .. out_suffix, 'w')) - block = block[1] - local parsed = parse_showlists(block, nil, nil, parsed) - local style = block.display and 0 or 2 - stream:write( - to_xml(convert.make_root(convert.process(parsed, style), style)), '\n' - ) - if not out_stream then stream:close() end +parsed.mathml = {} + +local function shallow_copy(t) + local new = {} + for k, v in next, t do + new[k] = v + end + return new +end + +-- Currently only 3 flag values are supported: +-- 0: Ignore (Doesn't make a lot of sense here) +-- 1: Only save +-- 3: Generate normally +for i, block in ipairs(parsed.groups) do + local flag, tag = block.flag, block.tag + block = block[1] + if flag & 3 ~= 0 then + local style = block.display and 0 or 2 + local xml = convert.process(parse_showlists(block, nil, nil, parsed), style) + if flag & 2 == 2 then + local stream = out_stream or assert(io.open(out_prefix .. tostring(i) .. out_suffix, 'w')) + stream:write(to_xml(convert.make_root(shallow_copy(xml), style)), '\n') + if not out_stream then stream:close() end + end + if tag ~= 'mrow' then + if xml[0] == 'mrow' then + xml[0] = tag + else + xml = {[0] = tag, xml} + end + end + if style == 2 and flag & 1 == 1 then + parsed.mathml[i] = xml + end + end end diff --git a/test_pdf.tex b/test_pdf.tex index be803a7..be80b1c 100644 --- a/test_pdf.tex +++ b/test_pdf.tex @@ -9,9 +9,9 @@ \cs_set_eq:NN \WriteoutFormula \luamml_pdf_write: \NewDocumentCommand\AnnotateFormula{ o m m }{% \IfValueTF{#1}{% - \luamml_annotate:nnn{#1}% + \luamml_annotate:nen{#1}% }{ - \luamml_annotate:nn + \luamml_annotate:en }{#2}{#3} } \ExplSyntaxOff From c78ac2e779baee8f7a60f350d5cb59faeb3571ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 26 Jun 2021 20:23:14 +0200 Subject: [PATCH 066/206] Merge luamml-pdf.sty into luamml.dtx --- luamml-pdf.sty | 120 ------------------------------- luamml.dtx | 190 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 183 insertions(+), 127 deletions(-) delete mode 100644 luamml-pdf.sty diff --git a/luamml-pdf.sty b/luamml-pdf.sty deleted file mode 100644 index 83ebda8..0000000 --- a/luamml-pdf.sty +++ /dev/null @@ -1,120 +0,0 @@ -\ProvidesExplPackage {luamml-pdf} {2021-05-31} {0.0.1-alpha} - {MathML generation for LฬถuฬถaฬถpdfLaTeX} - -\cs_if_exist:NTF \showstream { - \iow_new:N \l__luamml_pdf_stream - \iow_open:Nn \l__luamml_pdf_stream { \jobname .tml } - \cs_new_protected:Npn \__luamml_pdf_showlists: { - \group_begin: - \int_set:Nn \tex_showboxdepth:D { \c_max_int } - \int_set:Nn \tex_showboxbreadth:D { \c_max_int } - \showstream = \l__luamml_pdf_stream - \tex_showlists:D - \group_end: - } -} { - \cs_set_eq:NN \l__luamml_pdf_stream \c_log_iow - \cs_set_eq:NN \__luamml_pdf_set_showstream: \scan_stop: - \cs_new_protected:Npn \__luamml_pdf_showlists: { - \group_begin: - \int_set:Nn \l_tmpa_int { \tex_interactionmode:D } - \int_set:Nn \tex_interactionmode:D { 0 } - \int_set:Nn \tex_showboxdepth:D { \c_max_int } - \int_set:Nn \tex_showboxbreadth:D { \c_max_int } - \tex_showlists:D - \int_set:Nn \tex_interactionmode:D { \l_tmpa_int } - \group_end: - } -} - -\int_new:N \g__luamml_formula_id_int -\cs_new_protected:Npn \luamml_pdf_write: { - \int_gincr:N \g__luamml_formula_id_int - \iow_now:Nx \l__luamml_pdf_stream { - LUAMML_FORMULA_BEGIN: - \int_use:N \g__luamml_formula_id_int - :3:mrow - } - \__luamml_pdf_showlists: - \iow_now:Nx \l__luamml_pdf_stream { - LUAMML_FORMULA_END - } -} - -\cs_new:Npn \luamml_pdf_last_formula: { - \int_use:N \g__luamml_formula_id_int -} - -\cs_generate_variant:Nn \tl_to_str:n { e } - -% annotate parameters -% #1 number of top level nodes to be annotated -% #2 annotation -% #3 nodes to be annotated -\int_new:N \g__luamml_annotation_id_int -\cs_new_protected:Npn \luamml_annotate:nen #1#2#3 { - \int_gincr:N \g__luamml_annotation_id_int - \iow_shipout_x:Nx \l__luamml_pdf_stream { - \tl_to_str:e { - LUAMML_MARK: - \int_use:N \g__luamml_annotation_id_int - : - count = \int_eval:n {#1}, - #2 - } - \exp_not:N \iow_newline: - LUAMML_MARK_END - } - #3 -} - -% annotate parameters -% #1 annotation -% #2 nodes to be annotated -% THIS VERSION IS SIGNIFICANTLY SLOWER -\cs_new_protected:Npn \luamml_annotate:en #1#2 { - \int_gincr:N \g__luamml_annotation_id_int - \iow_shipout_x:Nx \l__luamml_pdf_stream { - \tl_to_str:e { - LUAMML_MARK: - \int_use:N \g__luamml_annotation_id_int - : - count = data.count[\int_use:N \g__luamml_annotation_id_int], - #1 - } - \exp_not:N \iow_newline: - LUAMML_MARK_END - } - \iow_now:Nx \l__luamml_pdf_stream { - LUAMML_COUNT: - \int_use:N \g__luamml_annotation_id_int - } - \__luamml_pdf_showlists: - #2 - \iow_now:Nx \l__luamml_pdf_stream { - LUAMML_COUNT_END - } - \__luamml_pdf_showlists: -} - -\NewDocumentCommand \RegisterFamilyMapping {m m} { - \iow_now:Nx \l__luamml_pdf_stream { - LUAMML_INSTRUCTION:REGISTER_MAPPING: \int_use:N #1 : #2 - } -} - -\endinput - -\cs_new:Npn \__luamml_patch_package:nn #1 #2 { - \@ifpackageloaded {#1} {#2} { - \hook_gput_code:nnn {package/after/#1} {luamml} {#2} - } -} -\cs_new:Npn \__luamml_patch_package:n #1 { - \__luamml_patch_package:nn {#1} { - \RequirePackage { luamml-patches-#1 } - } -} -\RequirePackage { luamml-patches-kernel } -\__luamml_patch_package:n {amsmath} -\__luamml_patch_package:n {array} diff --git a/luamml.dtx b/luamml.dtx index 520f033..874403b 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -20,7 +20,10 @@ % \input docstrip.tex \keepsilent -\generate{\file{luamml.sty}{\from{luamml.dtx}{package}}} +\generate{ + \file{luamml.sty}{\from{luamml.dtx}{package,luatex}} + \file{luamml-pdf.sty}{\from{luamml.dtx}{package,pdftex}} +} \endbatchfile % %<*gobble> @@ -56,13 +59,20 @@ % % \begin{implementation} % \section{Package Implementation} +% \subsection{Initialization} % \iffalse %<*package> % \fi % \begin{macrocode} %<@@=luamml> +%<*luatex> \ProvidesExplPackage {luamml} {2021-04-23} {0.0.1-alpha} {Automatically generate presentational MathML from LuaTeX math expressions} +% +%<*pdftex> +\ProvidesExplPackage {luamml-pdf} {2021-05-31} {0.0.1-alpha} + {MathML generation for LฬถuฬถaฬถpdfLaTeX} +% % \end{macrocode} % % \subsection{Initialization} @@ -75,15 +85,18 @@ % them later. % \begin{macrocode} \int_new:N \l__luamml_flag_int -\tl_new:N \l__luamml_filename_tl +%\tl_new:N \l__luamml_filename_tl \tl_new:N \l__luamml_root_tl \tl_set:Nn \l__luamml_root_tl { mrow } -\int_new:N \tracingmathml +%\int_new:N \g__luamml_formula_id_int +%\int_new:N \tracingmathml % \end{macrocode} % % Now we can load the Lua module which defines the callback. +% Of course until pdf\TeX starts implementing \cs{directlua} this is only +% done in Lua\TeX. % \begin{macrocode} -\lua_now:n { require'luamml-tex' } +%\lua_now:n { require'luamml-tex' } % \end{macrocode} % % \subsection{Flags} @@ -158,12 +171,14 @@ % % \begin{macro}{\luamml_flag_structelem:} % Like \cs{luamml_flag_process:}, but additionally add PDF structure -% elements. This only works if \pkg{tagpdf} has been loaded \emph{before} -% \texttt{luamml}. +% elements. This only works in Lua\TeX\ and requires that the \pkg{tagpdf} package +% has been loaded \emph{before} \texttt{luamml}. % \begin{macrocode} +%<*luatex> \cs_new_protected:Npn \luamml_flag_structelem: { \int_set:Nn \l__luamml_flag_int { 11 } } +% % \end{macrocode} % \end{macro} % @@ -176,10 +191,15 @@ % % Only complete formulas get written into files (so formulas where % \cs{luamml_flag_process:} or \cs{luamml_flag_structelem:} are in effect). +% +% Only implemented in Lua\TeX, in pdf\TeX\ the arguments for \texttt{pdfmml} +% determine the output location. % \begin{macrocode} +%<*luatex> \cs_new_protected:Npn \luamml_set_filename:n { \tl_set:Nn \l__luamml_filename_tl } +% % \end{macrocode} % \end{macro} % @@ -189,11 +209,17 @@ % \end{macrocode} % % \subsection{Annotations} +% These are implemented very differently depending on the engine, but the interface +% should be the same. +% \subsubsection{Lua\TeX} +% \begin{macrocode} +%<*luatex> +% \end{macrocode} % \begin{macro}{\luamml_annotate:nen, \luamml_annotate:en} % A simple annotation scheme: The first argument is the number of top level % noads to be annotated, the second parameter the annotation and the third % parameter the actual list of math tokens. The first argument can be omitted to -% let Lua\TeX detrmine the number itself. +% let Lua\TeX determine the number itself. % % Passing the first parameter explicitly is useful for any annotations which % should be compatible with fututre pdf\TeX versions of this functionality. @@ -212,6 +238,153 @@ % \end{macrocode} % \end{macro} % +% \begin{macrocode} +% +% \end{macrocode} + +% \subsubsection{pdf\TeX} +% \begin{macrocode} +%<*pdftex> +% \end{macrocode} +% \begin{macro}{\__luamml_pdf_showlists:} +% Here and in many other locations the \pdfTeX{} implementation is based on \cs{showlists}, +% so we define a internal wrapper which sets all relevant parameters. +% \begin{macrocode} +\cs_if_exist:NTF \showstream { + \iow_new:N \l__luamml_pdf_stream + \iow_open:Nn \l__luamml_pdf_stream { \jobname .tml } + \cs_new_protected:Npn \__luamml_pdf_showlists: { + \group_begin: + \int_set:Nn \tex_showboxdepth:D { \c_max_int } + \int_set:Nn \tex_showboxbreadth:D { \c_max_int } + \showstream = \l__luamml_pdf_stream + \tex_showlists:D + \group_end: + } +} { + \cs_set_eq:NN \l__luamml_pdf_stream \c_log_iow + \cs_set_eq:NN \__luamml_pdf_set_showstream: \scan_stop: + \cs_new_protected:Npn \__luamml_pdf_showlists: { + \group_begin: + \int_set:Nn \l_tmpa_int { \tex_interactionmode:D } + \int_set:Nn \tex_interactionmode:D { 0 } + \int_set:Nn \tex_showboxdepth:D { \c_max_int } + \int_set:Nn \tex_showboxbreadth:D { \c_max_int } + \tex_showlists:D + \int_set:Nn \tex_interactionmode:D { \l_tmpa_int } + \group_end: + } +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\luamml_annotate:nen, \luamml_annotate:en} +% Now we can define the annotation commands for pdf\TeX. +% \begin{macrocode} +\cs_generate_variant:Nn \tl_to_str:n { e } +\int_new:N \g__luamml_annotation_id_int +\cs_new_protected:Npn \luamml_annotate:nen #1#2#3 { + \int_gincr:N \g__luamml_annotation_id_int + \iow_shipout_x:Nx \l__luamml_pdf_stream { + \tl_to_str:e { + LUAMML_MARK: + \int_use:N \g__luamml_annotation_id_int + : + count = \int_eval:n {#1}, + #2 + } + \exp_not:N \iow_newline: + LUAMML_MARK_END + } + #3 +} +\cs_new_protected:Npn \luamml_annotate:en #1#2 { + \int_gincr:N \g__luamml_annotation_id_int + \iow_shipout_x:Nx \l__luamml_pdf_stream { + \tl_to_str:e { + LUAMML_MARK: + \int_use:N \g__luamml_annotation_id_int + : + count = data.count[\int_use:N \g__luamml_annotation_id_int], + #1 + } + \exp_not:N \iow_newline: + LUAMML_MARK_END + } + \iow_now:Nx \l__luamml_pdf_stream { + LUAMML_COUNT: + \int_use:N \g__luamml_annotation_id_int + } + \__luamml_pdf_showlists: + #2 + \iow_now:Nx \l__luamml_pdf_stream { + LUAMML_COUNT_END + } + \__luamml_pdf_showlists: +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +% +% \end{macrocode} +% +% \subsection{Trigger for specific formula} +% This only applies for pdf\TeX\ since in Lua\TeX\ everything is controlled by the callback. +% +% \begin{macrocode} +%<*pdftex> +% \end{macrocode} +% +% \begin{macro}{\luamml_pdf_write:} +% We could accept parameters for the flag and tag here, but for compatibility +% with Lua\TeX they are passed in macros instead. +% \begin{macrocode} +\cs_new_protected:Npn \luamml_pdf_write: { + \int_gincr:N \g__luamml_formula_id_int + \iow_now:Nx \l__luamml_pdf_stream { + LUAMML_FORMULA_BEGIN: + \int_use:N \g__luamml_formula_id_int + :3:mrow + } + \__luamml_pdf_showlists: + \iow_now:Nx \l__luamml_pdf_stream { + LUAMML_FORMULA_END + } +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\luamml_pdf_last_formula:} +% A unique identifier for the last formula written with \cs{luamml_pdf_write:}. +% Some form of this will probably be added to the Lua\TeX insterface at some point. +% \begin{macrocode} +\cs_new:Npn \luamml_pdf_last_formula: { + \int_use:N \g__luamml_formula_id_int +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +% +% \end{macrocode} +% +% \subsection{Further helpers} +% +% \begin{macro}{\RegisterFamilyMapping} +% The Lua version of this is defined in the Lua module. +% \begin{macrocode} +%<*pdftex> +\NewDocumentCommand \RegisterFamilyMapping {m m} { + \iow_now:Nx \l__luamml_pdf_stream { + LUAMML_INSTRUCTION:REGISTER_MAPPING: \int_use:N #1 : #2 + } +} +% +% \end{macrocode} +% +% % \subsection{Patching} % For some packages, we ship with patches to make them more compatible and to % demonstrate how other code can be patched to work with \texttt{luamml}. @@ -237,10 +410,13 @@ % \end{macrocode} % \end{macro} % +% % \begin{macrocode} +%<*luatex> \RequirePackage { luamml-patches-kernel } \__luamml_patch_package:n {amsmath} \__luamml_patch_package:n {array} +% % \end{macrocode} % \iffalse From 75a03787f80eed13865cb3410d99185204ccbc2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 26 Jun 2021 20:51:33 +0200 Subject: [PATCH 067/206] Apply flags and root tag in pdfTeX --- luamml.dtx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/luamml.dtx b/luamml.dtx index 874403b..8faa720 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -346,7 +346,10 @@ \iow_now:Nx \l__luamml_pdf_stream { LUAMML_FORMULA_BEGIN: \int_use:N \g__luamml_formula_id_int - :3:mrow + : + \int_use:N \l__luamml_flag_int + : + \l__luamml_root_tl } \__luamml_pdf_showlists: \iow_now:Nx \l__luamml_pdf_stream { From e6077a2702c55bd0521bc6485becd50e4f2b68d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 26 Jun 2021 22:38:24 +0200 Subject: [PATCH 068/206] Fix flags --- luamml-tex.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/luamml-tex.lua b/luamml-tex.lua index f8ed7a3..d7ac64e 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -61,7 +61,7 @@ end -- Bit 5-7: See Bit 4 -- Bit 4: Overwrite mathstyle with bit 9-11 -- Bit 3: Generate MathML structure elements --- Bit 2: Reserved +-- Bit 2: Change root element name for saved element -- Bit 1: Save MathML as a fully converted formula -- Bit 0: Save MathML for later usage in startmath node. Ignored for display math. @@ -99,11 +99,12 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) end local display = style == 'display' local startmath = tex.nest.top.tail -- Must come before any write_struct calls which adds nodes - style = flag & 4 == 4 and flag>>5 & 0x7 or display and 0 or 2 + style = flag & 16 == 4 and flag>>5 & 0x7 or display and 0 or 2 local xml, core = process_mlist(mlist, style) if flag & 2 == 2 then xml = save_result(shallow_copy(xml), display) - else + end + if flag & 4 == 4 then local element_type = token.get_macro'l__luamml_root_tl' if element_type ~= 'mrow' then if xml[0] == 'mrow' then From e21116b5014fd8c996472d2d27cdec1896b0b0a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 27 Jun 2021 00:43:30 +0200 Subject: [PATCH 069/206] Add labels to saved formulas --- luamml-patches-amsmath.sty | 20 +++++++++---------- luamml-patches-array.sty | 6 +++--- luamml-patches-kernel.sty | 2 +- luamml-tex.lua | 16 +++++++++++++++ luamml.dtx | 41 +++++++++++++++++++------------------- pdfmml-logreader.lua | 2 +- pdfmml.lua | 9 ++++++--- 7 files changed, 57 insertions(+), 39 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 7e8ced2..f8933c4 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -42,7 +42,7 @@ \m@th \displaystyle {##} - \luamml_flag_save:Nn \displaystyle {mtd} + \luamml_flag_save:nNn {} \displaystyle {mtd} $ \__luamml_amsmath_add_last_to_row: \tabskip \z@skip @@ -54,7 +54,7 @@ {} ## } - \luamml_flag_save:Nn \displaystyle {mtd} + \luamml_flag_save:nNn {} \displaystyle {mtd} $ \__luamml_amsmath_add_last_to_row: \hfil @@ -85,7 +85,7 @@ \m@th \displaystyle ## - \luamml_flag_save:Nn \displaystyle {mtd} + \luamml_flag_save:nNn {} \displaystyle {mtd} $ \__luamml_amsmath_add_last_to_row: \hfil @@ -122,7 +122,7 @@ \m@th \displaystyle {##} - \luamml_flag_save:Nn \displaystyle {mtd} + \luamml_flag_save:nNn {} \displaystyle {mtd} $ } \__luamml_amsmath_add_box_to_row: @@ -180,7 +180,7 @@ \ifmeasuring@ \luamml_flag_ignore: \else - \luamml_flag_save:Nn \displaystyle {mtd} + \luamml_flag_save:nNn {} \displaystyle {mtd} \fi $ } @@ -204,7 +204,7 @@ \ifmeasuring@ \luamml_flag_ignore: \else - \luamml_flag_save:Nn \displaystyle {mtd} + \luamml_flag_save:nNn {} \displaystyle {mtd} \fi $ } @@ -298,14 +298,14 @@ % Less luckily, \endmultline@math sometimes get overwritten for the last line. % But that isn't a problem since we want special behavior there anyway. \cs_set:Npn \endmultline@math { - \luamml_flag_save:Nn \displaystyle {mtd} + \luamml_flag_save:nNn {} \displaystyle {mtd} $ \__luamml_amsmath_add_last_to_row: } \cs_set:Npn \rendmultline@ { \iftag@ - \luamml_flag_save:Nn \displaystyle {mtd} + \luamml_flag_save:nNn {} \displaystyle {mtd} $ \__luamml_amsmath_add_last_to_row: \let \endmultline@math \relax @@ -370,7 +370,7 @@ \m@th \scriptstyle ## - \luamml_flag_save:n {mtd} % No \scriptsize here since we want to add the mstyle nodes + \luamml_flag_save:nn {} {mtd} % No \scriptsize here since we want to add the mstyle nodes $ \__luamml_amsmath_add_last_to_row: \hfil @@ -381,7 +381,7 @@ \m@th \scriptstyle ## - \luamml_flag_save:n {mtd} % No \scriptsize here since we want to add the mstyle nodes + \luamml_flag_save:nn {} {mtd} % No \scriptsize here since we want to add the mstyle nodes $ \__luamml_amsmath_add_last_to_row: \hfil diff --git a/luamml-patches-array.sty b/luamml-patches-array.sty index dc15a40..7635323 100644 --- a/luamml-patches-array.sty +++ b/luamml-patches-array.sty @@ -18,7 +18,7 @@ } { \__luamml_array_init_col: \insert@column - \luamml_flag_save:n {mtd} + \luamml_flag_save:nn {} {mtd} \d@llarend \__luamml_array_finalize_col:w 0~ } @@ -33,7 +33,7 @@ } { \__luamml_array_init_col: \insert@column - \luamml_flag_save:n {mtd} + \luamml_flag_save:nn {} {mtd} \d@llarend \__luamml_array_finalize_col:w 1~ } @@ -49,7 +49,7 @@ } { \__luamml_array_init_col: \insert@column - \luamml_flag_save:n {mtd} + \luamml_flag_save:nn {} {mtd} \d@llarend \__luamml_array_finalize_col:w 2~ } diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index bec471b..1ae497a 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -9,7 +9,7 @@ \m@th #1 {#2} - \luamml_flag_save:Nn #1 {mphantom} + \luamml_flag_save:nNn {} #1 {mphantom} $ } \finph@nt diff --git a/luamml-tex.lua b/luamml-tex.lua index d7ac64e..a9be147 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -9,6 +9,7 @@ local write_xml = require'luamml-xmlwriter' local write_struct = require'luamml-structelemwriter' local filename_token = token.create'l__luamml_filename_tl' +local label_token = token.create'l__luamml_label_tl' local properties = node.get_properties_table() local mmode, hmode, vmode do @@ -70,6 +71,8 @@ local mlist_result local undefined_cmd = token.command_id'undefined_cs' local call_cmd = token.command_id'call' +local labelled_mathml = {} + local function save_result(xml, display, structelem) mlist_result = make_root(xml, display and 0 or 2) token.put_next(filename_token) @@ -121,6 +124,18 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) properties[startmath] = props end props.saved_mathml_table, props.saved_mathml_core = xml, core + token.put_next(label_token) + local label = token.scan_argument() + if label ~= '' then + if labelled_mathml[label] then + tex.error('MathML Label already in use', { + 'A MathML expression has a label which is already used by another \z + formula. If you do not want to label this formula with a unique \z + label, set a empty label instead.'}) + else + labelled_mathml[label] = xml + end + end if flag & 10 == 8 then write_struct(xml, true) -- This modifies xml in-place to reference the struture element end @@ -148,4 +163,5 @@ require'luamml-tex-annotate' return { save_result = save_result, + labelled = labelled_mathml, } diff --git a/luamml.dtx b/luamml.dtx index 8faa720..99038fc 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -88,6 +88,7 @@ %\tl_new:N \l__luamml_filename_tl \tl_new:N \l__luamml_root_tl \tl_set:Nn \l__luamml_root_tl { mrow } +\tl_new:N \l__luamml_label_tl %\int_new:N \g__luamml_formula_id_int %\int_new:N \tracingmathml % \end{macrocode} @@ -110,6 +111,7 @@ % \cs{luamml_flag_save:}. % \begin{macrocode} \cs_new_protected:Npn \luamml_flag_process: { + \tl_set:Nn \l__luamml_label_tl {} \int_set:Nn \l__luamml_flag_int { 3 } } % \end{macrocode} @@ -128,33 +130,37 @@ } % \end{macro} % -% \begin{macro}{\luamml_flag_save:, -% \luamml_flag_save:N, -% \luamml_flag_save:n, -% \luamml_flag_save:Nn} +% \begin{macro}{\luamml_flag_save:n, +% \luamml_flag_save:nN, +% \luamml_flag_save:nn, +% \luamml_flag_save:nNn} % Convert the current formula but only save it's representation in the math % node without emitting it as a complete formula. This is useful when the % expression forms part of a bigger formula and will be intergrated into it's % MathML tables later by special code. -% It optinally accepts two parameters: One math style command +% It optinally accepts three parameters: A label, one math style command % (\cs{displaystyle}, \cs{textstyle}, etc.) which is the implicit math style % (so the style which the surrounding code expects this style to have) and a % name for the root element (defaults to \texttt{mrow}). % If the root element name is \texttt{mrow}, it will get suppressed in some % cases. % \begin{macrocode} -\cs_new_protected:Npn \luamml_flag_save: { +\cs_new_protected:Npn \luamml_flag_save:n #1 { + \tl_set:Nn \l__luamml_label_tl {#1} \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 1 } } -\cs_new_protected:Npn \luamml_flag_save:N #1 { - \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 17 + 32 * #1 } +\cs_new_protected:Npn \luamml_flag_save:nN #1#2 { + \tl_set:Nn \l__luamml_label_tl {#1} + \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 17 + 32 * #2 } } -\cs_new_protected:Npn \luamml_flag_save:n { +\cs_new_protected:Npn \luamml_flag_save:nn #1 { + \tl_set:Nn \l__luamml_label_tl {#1} \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 5 } \tl_set:Nn \l__luamml_root_tl } -\cs_new_protected:Npn \luamml_flag_save:Nn #1 { - \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 21 + 32 * #1 } +\cs_new_protected:Npn \luamml_flag_save:nNn #1#2 { + \tl_set:Nn \l__luamml_label_tl {#1} + \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 21 + 32 * #2 } \tl_set:Nn \l__luamml_root_tl } % \end{macrocode} @@ -176,6 +182,7 @@ % \begin{macrocode} %<*luatex> \cs_new_protected:Npn \luamml_flag_structelem: { + \tl_set:Nn \l__luamml_label_tl {} \int_set:Nn \l__luamml_flag_int { 11 } } % @@ -350,6 +357,8 @@ \int_use:N \l__luamml_flag_int : \l__luamml_root_tl + : + \l__luamml_label_tl } \__luamml_pdf_showlists: \iow_now:Nx \l__luamml_pdf_stream { @@ -359,16 +368,6 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\luamml_pdf_last_formula:} -% A unique identifier for the last formula written with \cs{luamml_pdf_write:}. -% Some form of this will probably be added to the Lua\TeX insterface at some point. -% \begin{macrocode} -\cs_new:Npn \luamml_pdf_last_formula: { - \int_use:N \g__luamml_formula_id_int -} -% \end{macrocode} -% \end{macro} -% % \begin{macrocode} % % \end{macrocode} diff --git a/pdfmml-logreader.lua b/pdfmml-logreader.lua index a17f604..19d410e 100644 --- a/pdfmml-logreader.lua +++ b/pdfmml-logreader.lua @@ -8,7 +8,7 @@ local math_lists_block = l.Ct('### ' * l.Cg(l.C'display' * ' ', 'display')^-1 * * non_final_list_block)^1 local generic_list_block = '### ' * (line - 'current page:') * non_final_list_block local luamml_block = l.Cg('LUAMML_FORMULA_BEGIN:' * id * ':' * l.Ct( - l.Cg(id, 'flag') * ':' * l.Cg((1-l.P'\n')^0, 'tag') * l.P'\n'^1 + l.Cg(id, 'flag') * ':' * l.Cg((1-l.S':\n')^0, 'tag') * ':' * l.Cg((1-l.P'\n')^1, 'label')^-1 * l.P'\n'^1 * (math_lists_block + generic_list_block/0)^0 * (line - 'LUAMML_FORMULA_END\n')^0 diff --git a/pdfmml.lua b/pdfmml.lua index 116a617..05d16da 100755 --- a/pdfmml.lua +++ b/pdfmml.lua @@ -67,7 +67,7 @@ end -- 1: Only save -- 3: Generate normally for i, block in ipairs(parsed.groups) do - local flag, tag = block.flag, block.tag + local flag, tag, label = block.flag, block.tag, block.label block = block[1] if flag & 3 ~= 0 then local style = block.display and 0 or 2 @@ -84,8 +84,11 @@ for i, block in ipairs(parsed.groups) do xml = {[0] = tag, xml} end end - if style == 2 and flag & 1 == 1 then - parsed.mathml[i] = xml + if style == 2 and flag & 1 == 1 and label ~= '' then + if parsed.mathml[label] then + error'Invalid label reuse' + end + parsed.mathml[label] = xml end end end From d63bed65a1468105c18d1a4b7aa782e627291f5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 27 Jun 2021 04:30:49 +0200 Subject: [PATCH 070/206] More pdfTeX work --- luamml.dtx | 23 +++++++++++++++++++++-- pdfmml-logreader.lua | 2 +- pdfmml-showlists.lua | 11 +++++++++++ pdfmml.lua | 2 +- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/luamml.dtx b/luamml.dtx index 99038fc..7f02bbc 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -130,6 +130,25 @@ } % \end{macro} % +% \begin{macro}{\__luamml_style_to_num:N} +% \begin{macrocode} +\cs_new:Npn \__luamml_style_to_num:N #1 { +% 32 * #1 +%<*pdftex> + \token_case_meaning:NnF #1 { + \displaystyle {0} + \textstyle {32} + \scriptstyle {64} + \scriptscriptstyle {96} + } { + \Invalid_mathstyle + } +% +} +% \end{macrocode} +% \end{macro} +% +% % \begin{macro}{\luamml_flag_save:n, % \luamml_flag_save:nN, % \luamml_flag_save:nn, @@ -151,7 +170,7 @@ } \cs_new_protected:Npn \luamml_flag_save:nN #1#2 { \tl_set:Nn \l__luamml_label_tl {#1} - \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 17 + 32 * #2 } + \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 17 + \__luamml_style_to_num:N #2 } } \cs_new_protected:Npn \luamml_flag_save:nn #1 { \tl_set:Nn \l__luamml_label_tl {#1} @@ -160,7 +179,7 @@ } \cs_new_protected:Npn \luamml_flag_save:nNn #1#2 { \tl_set:Nn \l__luamml_label_tl {#1} - \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 21 + 32 * #2 } + \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 21 + \__luamml_style_to_num:N #2 } \tl_set:Nn \l__luamml_root_tl } % \end{macrocode} diff --git a/pdfmml-logreader.lua b/pdfmml-logreader.lua index 19d410e..a9f0e9e 100644 --- a/pdfmml-logreader.lua +++ b/pdfmml-logreader.lua @@ -2,7 +2,7 @@ local l = lpeg or require'lpeg' local line = (1-l.P'\n')^0 * '\n' -local id = l.R'09'/tonumber +local id = l.R'09'^1/tonumber local non_final_list_block = (l.C((1-l.P'\n')^1) * '\n' - '### ' + '\n')^0 local math_lists_block = l.Ct('### ' * l.Cg(l.C'display' * ' ', 'display')^-1 * 'math mode entered at line ' * l.Cg(l.R'09'^1 / tonumber, 'line') * '\n' * non_final_list_block)^1 diff --git a/pdfmml-showlists.lua b/pdfmml-showlists.lua index ddaab6a..20d11d1 100644 --- a/pdfmml-showlists.lua +++ b/pdfmml-showlists.lua @@ -56,6 +56,8 @@ local simple_noad = l.Ct( + '\\kern' * l.Cg(' ' * l.Cc(1) + l.Cc(0), 'subtype') * l.Cg(scaled, 'kern') * (' (for ' * (l.R'az' + l.S'/\\') * ')')^-1 * l.Cg(l.Cc'kern', 'id') ) * -1 +local box_node = '\\' * l.S'hv' * 'box(' + local fraction_noad = l.Ct('\\fraction, thickness ' * l.Cg('= default' * l.Cc(0x40000000) + scaled, 'width') * l.Cg(', left-delimiter ' * delimiter_code, 'left')^-1 * l.Cg(', right-delimiter ' * delimiter_code, 'right')^-1 @@ -72,9 +74,18 @@ local function parse_kernel(lines, i, prefix, parsed) if not line or line:sub(1, #prefix) ~= prefix then return nil, i end local result = math_char:match(lines[i], #prefix + 1) if result then return result, i+1 end + if box_node:match(lines[i], #prefix + 1) then return skip_list(lines, i+1, prefix .. '.') end result, i = parse_list(lines, i, prefix, parsed) return {list = result, id = 'sub_mlist'}, i end +function skip_list(lines, i, prefix) + i = i or 1 + local count = #lines + while i <= count and lines[i]:sub(1, #prefix) == prefix do + i = i + 1 + end + return {id = 'sub_box', list = {}}, i +end function parse_list(lines, i, prefix, parsed) i = i or 1 prefix = prefix or '' diff --git a/pdfmml.lua b/pdfmml.lua index 05d16da..457dda2 100755 --- a/pdfmml.lua +++ b/pdfmml.lua @@ -84,7 +84,7 @@ for i, block in ipairs(parsed.groups) do xml = {[0] = tag, xml} end end - if style == 2 and flag & 1 == 1 and label ~= '' then + if style == 2 and flag & 1 == 1 and label then if parsed.mathml[label] then error'Invalid label reuse' end From e1b8debcf63939f464a2518243f1d3cc1097a0d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 27 Jun 2021 05:39:42 +0200 Subject: [PATCH 071/206] More reliable pdfTeX annotations --- luamml.dtx | 59 +++++++++++++++++++++++++------------------- pdfmml-logreader.lua | 27 ++++++++++++-------- pdfmml-showlists.lua | 2 +- 3 files changed, 52 insertions(+), 36 deletions(-) diff --git a/luamml.dtx b/luamml.dtx index 7f02bbc..493e7a7 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -313,14 +313,17 @@ \cs_new_protected:Npn \luamml_annotate:nen #1#2#3 { \int_gincr:N \g__luamml_annotation_id_int \iow_shipout_x:Nx \l__luamml_pdf_stream { - \tl_to_str:e { - LUAMML_MARK: - \int_use:N \g__luamml_annotation_id_int - : - count = \int_eval:n {#1}, - #2 - } - \exp_not:N \iow_newline: + LUAMML_MARK_REF: + \int_use:N \g__luamml_annotation_id_int + : + } + \iow_now:Nx \l__luamml_pdf_stream { + LUAMML_MARK: + \int_use:N \g__luamml_annotation_id_int + : + count = \int_eval:n {#1}, + #2 + \iow_newline: LUAMML_MARK_END } #3 @@ -328,26 +331,32 @@ \cs_new_protected:Npn \luamml_annotate:en #1#2 { \int_gincr:N \g__luamml_annotation_id_int \iow_shipout_x:Nx \l__luamml_pdf_stream { - \tl_to_str:e { - LUAMML_MARK: - \int_use:N \g__luamml_annotation_id_int - : - count = data.count[\int_use:N \g__luamml_annotation_id_int], - #1 - } - \exp_not:N \iow_newline: + LUAMML_MARK_REF: + \int_use:N \g__luamml_annotation_id_int + : + } + \iow_now:Nx \l__luamml_pdf_stream { + LUAMML_MARK: + \int_use:N \g__luamml_annotation_id_int + : + count = data.count[\int_use:N \g__luamml_annotation_id_int], + #1 + \iow_newline: LUAMML_MARK_END } - \iow_now:Nx \l__luamml_pdf_stream { - LUAMML_COUNT: - \int_use:N \g__luamml_annotation_id_int + \use:x { + \iow_now:Nn \l__luamml_pdf_stream { + LUAMML_COUNT: + \int_use:N \g__luamml_annotation_id_int + } + \__luamml_pdf_showlists: + \exp_not:n {#2} + \iow_now:Nn \l__luamml_pdf_stream { + LUAMML_COUNT_END: + \int_use:N \g__luamml_annotation_id_int + } + \__luamml_pdf_showlists: } - \__luamml_pdf_showlists: - #2 - \iow_now:Nx \l__luamml_pdf_stream { - LUAMML_COUNT_END - } - \__luamml_pdf_showlists: } % \end{macrocode} % \end{macro} diff --git a/pdfmml-logreader.lua b/pdfmml-logreader.lua index a9f0e9e..2b66e8b 100644 --- a/pdfmml-logreader.lua +++ b/pdfmml-logreader.lua @@ -18,13 +18,11 @@ local luamml_mark = l.Cg('LUAMML_MARK:' * id * ':' * l.Cs((1 - l.P'\n' + l.Cg('\ local function add(a, b) return a + b end local count_block = '### ' * line * l.Cf(l.Cc(0) * (('\\' * l.Cc(1))^-1 * line - '### ')^0, add) -local luamml_count = l.Cg('LUAMML_COUNT:' * id * l.P'\n'^1 - * count_block - * (line-'LUAMML_COUNT_END\n')^0 - * 'LUAMML_COUNT_END' * l.P'\n'^1 - * count_block / function(id, first, second) - return id, second - first - end * l.Cc'count') +local luamml_precount = l.Cg('LUAMML_COUNT:' * id * l.P'\n'^1 + * count_block * l.Cc'precount') + +local luamml_postcount = l.Cg('LUAMML_COUNT_END:' * id * l.P'\n'^1 + * count_block * l.Cc'postcount') local luamml_instruction = l.Cg('LUAMML_INSTRUCTION:' * l.Cc(nil) * l.C((1 - l.P'\n')^0) * '\n' * l.Cc'instructions') @@ -34,10 +32,11 @@ local function multi_table_set(t, key, value, table) return t end local log_file = l.Cf(l.Ct(l.Cg(l.Ct'', 'groups') - * l.Cg(l.Ct'', 'count') + * l.Cg(l.Ct'', 'precount') + * l.Cg(l.Ct'', 'postcount') * l.Cg(l.Ct'', 'marks') * l.Cg(l.Ct'', 'instructions')) - * (luamml_block + luamml_mark + luamml_instruction + luamml_count + line)^0, + * (luamml_block + luamml_mark + luamml_instruction + luamml_precount + luamml_postcount + line)^0, multi_table_set) return function(filename) @@ -50,5 +49,13 @@ return function(filename) if f then f:close() end -- The following does *not* end with * -1 since we want to allow the last line to not end with \n. -- In that case we ignore the last line, but that's safe since the last line never contains our markers. - return assert(log_file:match(content)) + local parsed = assert(log_file:match(content)) + local precount, postcount, count = parsed.precount, parsed.postcount, {} + for id, pre in next, precount do + local post = assert(postcount[id], 'Unbalanced count') + count[id], postcount[id] = post-pre, nil + end + assert(not next(postcount), 'Unbalanced count') + parsed.precount, parsed.postcount, parsed.count = nil, nil, count + return parsed end diff --git a/pdfmml-showlists.lua b/pdfmml-showlists.lua index 20d11d1..8d0a9dc 100644 --- a/pdfmml-showlists.lua +++ b/pdfmml-showlists.lua @@ -66,7 +66,7 @@ local fraction_noad = l.Ct('\\fraction, thickness ' local mathchoice_noad = l.Ct('\\mathchoice' * l.Cg(l.Cc'choice', 'id') * -1) -local mark_whatsit = '\\write' * ('-' + l.R'09'^1) * '{LUAMML_MARK:' * (l.R'09'^1/tonumber) * ':' +local mark_whatsit = '\\write' * ('-' + l.R'09'^1) * '{LUAMML_MARK_REF:' * (l.R'09'^1/tonumber) * ':' local parse_list local function parse_kernel(lines, i, prefix, parsed) From e76d9ec8bfc3a80064856507fd9c2e5d186320d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 28 Jun 2021 06:35:57 +0200 Subject: [PATCH 072/206] Fix style flag handling --- luamml-tex.lua | 2 +- pdfmml.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/luamml-tex.lua b/luamml-tex.lua index a9be147..8832025 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -102,7 +102,7 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) end local display = style == 'display' local startmath = tex.nest.top.tail -- Must come before any write_struct calls which adds nodes - style = flag & 16 == 4 and flag>>5 & 0x7 or display and 0 or 2 + style = flag & 16 == 16 and flag>>5 & 0x7 or display and 0 or 2 local xml, core = process_mlist(mlist, style) if flag & 2 == 2 then xml = save_result(shallow_copy(xml), display) diff --git a/pdfmml.lua b/pdfmml.lua index 457dda2..7a0aac2 100755 --- a/pdfmml.lua +++ b/pdfmml.lua @@ -70,7 +70,7 @@ for i, block in ipairs(parsed.groups) do local flag, tag, label = block.flag, block.tag, block.label block = block[1] if flag & 3 ~= 0 then - local style = block.display and 0 or 2 + local style = flag & 16 == 16 and flag>>5 & 0x7 or block.display and 0 or 2 local xml = convert.process(parse_showlists(block, nil, nil, parsed), style) if flag & 2 == 2 then local stream = out_stream or assert(io.open(out_prefix .. tostring(i) .. out_suffix, 'w')) @@ -84,7 +84,7 @@ for i, block in ipairs(parsed.groups) do xml = {[0] = tag, xml} end end - if style == 2 and flag & 1 == 1 and label then + if (not block.display) and flag & 1 == 1 and label then if parsed.mathml[label] then error'Invalid label reuse' end From 5252cbc90d8c36d405148ee0ec0d215d1f562698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 28 Jun 2021 06:36:36 +0200 Subject: [PATCH 073/206] Add interfaces in LuaTeX for pdfTeX compatibility This is a combination of 2 commits. - Provide \luamml_pdf_write: dummy in LuaTeX - Make labelled formulas accessible in LuaTeX annotations --- luamml-tex-annotate.lua | 7 ++++++- luamml-tex.lua | 3 ++- luamml.dtx | 11 +++++------ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/luamml-tex-annotate.lua b/luamml-tex-annotate.lua index cb7a8ed..0f852ad 100644 --- a/luamml-tex-annotate.lua +++ b/luamml-tex-annotate.lua @@ -2,7 +2,10 @@ local nest = tex.nest local properties = node.get_properties_table() -local mark_environment = {} +local mark_environment = { + data = { + }, +} local function annotate() local annotation, err = load( 'return {' @@ -98,3 +101,5 @@ end funcid = luatexbase.new_luafunction'__luamml_annotate_end:e' token.set_lua('__luamml_annotate_end:e', funcid, 'protected') lua.get_functions_table()[funcid] = annotate + +return mark_environment diff --git a/luamml-tex.lua b/luamml-tex.lua index 8832025..49f645a 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -159,7 +159,8 @@ lua.get_functions_table()[funcid] = function() mlist_result = nil end -require'luamml-tex-annotate' +local annotate_context = require'luamml-tex-annotate' +annotate_context.data.mathml = labelled_mathml return { save_result = save_result, diff --git a/luamml.dtx b/luamml.dtx index 493e7a7..9606158 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -366,16 +366,14 @@ % \end{macrocode} % % \subsection{Trigger for specific formula} -% This only applies for pdf\TeX\ since in Lua\TeX\ everything is controlled by the callback. -% -% \begin{macrocode} -%<*pdftex> -% \end{macrocode} +% This only applies for pdf\TeX\ since in Lua\TeX\ everything is controlled by the callback, +% but for compatibility the function is defined anyway. % % \begin{macro}{\luamml_pdf_write:} % We could accept parameters for the flag and tag here, but for compatibility % with Lua\TeX they are passed in macros instead. % \begin{macrocode} +%<*pdftex> \cs_new_protected:Npn \luamml_pdf_write: { \int_gincr:N \g__luamml_formula_id_int \iow_now:Nx \l__luamml_pdf_stream { @@ -393,11 +391,12 @@ LUAMML_FORMULA_END } } +% +%\cs_new_eq:NN \luamml_pdf_write: \scan_stop: % \end{macrocode} % \end{macro} % % \begin{macrocode} -% % \end{macrocode} % % \subsection{Further helpers} From 235815eb98009b78be191605f61e75521a7d532d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 28 Jun 2021 06:33:49 +0200 Subject: [PATCH 074/206] Adapt phantom patches for pdfTeX --- luamml-kernel.lua | 33 --------------------------------- luamml-patches-kernel.sty | 34 ++++++++++++++++++++++++++-------- luamml.dtx | 5 +++-- 3 files changed, 29 insertions(+), 43 deletions(-) delete mode 100644 luamml-kernel.lua diff --git a/luamml-kernel.lua b/luamml-kernel.lua deleted file mode 100644 index 678fce1..0000000 --- a/luamml-kernel.lua +++ /dev/null @@ -1,33 +0,0 @@ -local properties = node.get_properties_table() -local if_vertical = token.create'ifv@' -local if_horizontal = token.create'ifh@' -local iftrue_index = token.create'iftrue'.index - -local funcid = luatexbase.new_luafunction'__luamml_kernel_finalize_phantom:' -token.set_lua('__luamml_kernel_finalize_phantom:', funcid, 'protected') -lua.get_functions_table()[funcid] = function() - -- TODO: Error handling etc - -- At this point, box 0 contains the inner expression and the curent list ends with the noad whose nucleus should get replaced - local boxnum = 0 - local startmath = tex.box[boxnum].list - assert(startmath.id == node.id"math") - local nucl = assert(tex.nest.top.tail.nucleus) - local props = properties[nucl] - if not props then -- very likely - props = {} - properties[nucl] = props - end - assert(not props.mathml_table) - local saved_props = assert(properties[startmath]) - local saved_core = saved_props.saved_mathml_core - local saved = assert(saved_props.saved_mathml_table or saved_core) - -- The following could be optimized for the case that both if_vertical and if_horizontal - -- are set, but that should't happen ayway and is just supported for consistency. - if if_vertical.index ~= iftrue_index then - saved = {[0] = 'mpadded', height = 0, depth = 0, saved} - end - if if_horizontal.index ~= iftrue_index then - saved = {[0] = 'mpadded', width = 0, saved} - end - props.mathml_table, props.mathml_core = saved, saved_core -end diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index 1ae497a..e150a33 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -1,17 +1,35 @@ \ProvidesExplPackage {luamml-patches-kernel} {2021-05-30} {0.0.1-alpha} {Feel free to add a description here} -\lua_now:n { require'luamml-kernel' } - -\cs_set:Npn \mathph@nt #1 #2 { +\cs_new:Npn \__luamml_kernel_phantom:nnn #1#2#3 { \hbox_set:Nn \c_zero_int { $ \m@th - #1 - {#2} - \luamml_flag_save:nNn {} #1 {mphantom} + #2 + {#3} + \luamml_flag_save:nNn {mathphant_#1} #2 {mphantom} + \luamml_pdf_write: $ } - \finph@nt - \__luamml_kernel_finalize_phantom: + \luamml_annotate:nen {1} { + nucleus = true, + core = {[0] = 'mpadded', + \ifh@\else + width = 0, + \fi + \ifv@\else + height = 0, depth = 0, + \fi + data.mathml.mathphant_#1, + } + } { + \finph@nt + } +} +\cs_generate_variant:Nn \__luamml_kernel_phantom:nnn {V} + +\int_new:N \g__luamml_kernel_phantom_int +\cs_set:Npn \mathph@nt { + \int_gincr:N \g__luamml_kernel_phantom_int + \__luamml_kernel_phantom:Vnn \g__luamml_kernel_phantom_int } diff --git a/luamml.dtx b/luamml.dtx index 9606158..e577199 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -439,10 +439,11 @@ % \end{macrocode} % \end{macro} % -% +% We currently provide minimal patching for the kernel, \pkg{amsmath} and \pkg{array}. +% Currently only the kernel code supports pdf\TeX, but it's planned to extend this. % \begin{macrocode} -%<*luatex> \RequirePackage { luamml-patches-kernel } +%<*luatex> \__luamml_patch_package:n {amsmath} \__luamml_patch_package:n {array} % From 3eae23c2683b54a5c647b870ef2424da8170d4b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 3 Jul 2021 06:19:53 +0200 Subject: [PATCH 075/206] Annotate composed kernel symbols --- luamml-patches-kernel.sty | 24 ++++++++++++++++++++++++ pdfmml-showlists.lua | 11 +++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index e150a33..e03a991 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -33,3 +33,27 @@ \int_gincr:N \g__luamml_kernel_phantom_int \__luamml_kernel_phantom:Vnn \g__luamml_kernel_phantom_int } + +\@ifpackageloaded {unicode-math} {} { + \cs_new:Npn \__luamml_kernel_define_character:Nnn #1#2#3 { + \cs_set:cpx { \cs_to_str:N #1 ~ } { + \luamml_annotate:nen {#2} { + nucleus = true, core = {[0] = 'mi', '\string\u{#3}'}, + } { + \exp_not:v { \cs_to_str:N #1 ~ } + } + } + } + + \__luamml_kernel_define_character:Nnn \models {3} {22a7} + \__luamml_kernel_define_character:Nnn \hookrightarrow {3} {21aa} + \__luamml_kernel_define_character:Nnn \hookleftarrow {3} {21a9} + \__luamml_kernel_define_character:Nnn \bowtie {3} {22c8} + \__luamml_kernel_define_character:Nnn \Longrightarrow {3} {27f9} + \__luamml_kernel_define_character:Nnn \longrightarrow {3} {27f6} + \__luamml_kernel_define_character:Nnn \Longleftarrow {3} {27f8} + \__luamml_kernel_define_character:Nnn \longleftarrow {3} {27f5} + \__luamml_kernel_define_character:Nnn \Longleftrightarrow {3} {27fa} + \__luamml_kernel_define_character:Nnn \longleftrightarrow {3} {27f7} + \__luamml_kernel_define_character:Nnn \longmapsto {4} {27fc} +} diff --git a/pdfmml-showlists.lua b/pdfmml-showlists.lua index 8d0a9dc..340c9f9 100644 --- a/pdfmml-showlists.lua +++ b/pdfmml-showlists.lua @@ -130,8 +130,15 @@ function parse_list(lines, i, prefix, parsed) local mark = mark_whatsit:match(line, #prefix+1) if mark then local mark_table = assert(load('return {' .. assert(parsed.marks[mark], 'Undefined mark encountered') .. '}', nil, 't', mark_environment))() - current_mark, current_count = mark_table, mark_table.count or 1 - current_offset = mark_table.offset or current_count + if current_mark then + if (mark_table.count or 1) > current_count then + error'Invalid mark nesting' + end + -- Ignore new mark if existing mark is evaluated. This should be replaced with proper nesting + else + current_mark, current_count = mark_table, mark_table.count or 1 + current_offset = mark_table.offset or current_count + end i = i + 1 else print(line, prefix, i) From 71c127dd67e293d4223b620e5a10802ef8aea6e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 3 Jul 2021 22:38:32 +0200 Subject: [PATCH 076/206] Extend showlists parser --- pdfmml-showlists.lua | 73 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/pdfmml-showlists.lua b/pdfmml-showlists.lua index 340c9f9..f4af647 100644 --- a/pdfmml-showlists.lua +++ b/pdfmml-showlists.lua @@ -11,6 +11,19 @@ local tex_char = l.Cg('^^' * (hex_digit * hex_digit / hex_to_int + l.P(1) / string.byte) local scaled = l.P'-'^-1 * l.R'09'^1 * '.' * l.R'09'^1 / function(s) return (tonumber(s * 0x10000) + .5) // 1 end +local int = l.P'-'^-1 * l.R'09'^1 / tonumber +local glue_order_mu = 'filll' * l.Cc(3) + + 'fill' * l.Cc(2) + + 'fil' * l.Cc(1) + + 'mu' * l.Cc(0) +local glue_order_pt = 'filll' * l.Cc(3) + + 'fill' * l.Cc(2) + + 'fil' * l.Cc(1) + + 'pt' * l.Cc(0) +local glue_order = 'filll' * l.Cc(3) + + 'fill' * l.Cc(2) + + 'fil' * l.Cc(1) + + l.Cc(0) local delimiter_code = '"' * (l.R('09', 'AF')^1 / function(s) local code = tonumber(s, 16) return {id = 'delim', @@ -21,8 +34,43 @@ local delimiter_code = '"' * (l.R('09', 'AF')^1 / function(s) } end) +local balanced_braces = l.Ct{'{' * (1-l.S'{}'+l.V(1))^0 * '}'} + local math_char = l.Ct('\\fam' * l.Cg(l.R'09'^1 / tonumber, 'fam') * ' ' * l.Cg(tex_char, 'char') * l.Cg(l.Cc'math_char', 'id')) +local hdw = '(' * l.Cg(scaled + '*' * l.Cc(-0x40000000), 'height') * '+' * l.Cg(scaled + '*' * l.Cc(-0x40000000), 'depth') * ')x' * l.Cg(scaled + '*' * l.Cc(-0x40000000), 'width') + +local generic_simple_node = l.Ct( + '\\' * l.Cg('rule', 'id') * hdw + + '\\kern' * l.Cg(' ' * l.Cc(1) + l.Cc(0), 'subtype') * l.Cg(scaled, 'kern') * (' (for ' * (l.R'az' + l.S'/\\') * ')')^-1 * l.Cg(l.Cc'kern', 'id') + + '\\glue' * l.Cg('(\\' * ( + 'line' * l.Cc(1) + + 'baseline' * l.Cc(2) + + 'par' * l.Cc(3) + + 'abovedisplay' * l.Cc(4) + + 'belowdisplay' * l.Cc(5) + + 'abovedisplayshort' * l.Cc(6) + + 'belowdisplayshort' * l.Cc(7) + + 'left' * l.Cc(8) + + 'right' * l.Cc(9) + + 'top' * l.Cc(10) + + 'splittop' * l.Cc(11) + + 'tab' * l.Cc(12) + + 'space' * l.Cc(13) + + 'xspace' * l.Cc(14) + + 'parfill' * l.Cc(15) + + 'math' * l.Cc(16) + + 'thinmu' * l.Cc(17) + + 'medmu' * l.Cc(18) + + 'thickmu' * l.Cc(19)) * 'skip)' + l.Cc(0), 'subtype') + * ' ' * l.Cg(scaled, 'width') + * (' plus ' * l.Cg(scaled, 'stretch') * l.Cg(glue_order, 'stretch_order') + l.Cg(l.Cc(0), 'stretch') * l.Cg(l.Cc(0), 'stretch_order')) + * (' minus ' * l.Cg(scaled, 'shrink') * l.Cg(glue_order, 'shrink_order') + l.Cg(l.Cc(0), 'shrink') * l.Cg(l.Cc(0), 'shrink_order')) + * l.Cg(l.Cc'glue', 'id') + + '\\penalty ' * l.Cg(int, 'penalty') * l.Cg(l.Cc'penalty', 'id') + + '\\mark' * l.Cg('s' * int + l.Cc(0), 'class') * l.Cg(balanced_braces, 'mark') * l.Cg(l.Cc'mark', 'id') +) * -1 + local simple_noad = l.Ct( '\\math' * l.Cg( 'ord' * l.Cc(0) @@ -52,11 +100,32 @@ local simple_noad = l.Ct( + 'text' * l.Cc(2) + 'scriptscript' * l.Cc(6) + 'script' * l.Cc(4), 'subtype') * l.Cg('style', 'id') + + '\\glue(\\nonscript)' * l.Cg(l.Cc(98), 'subtype') * l.Cg(l.Cc'glue', 'id') + '\\mkern' * l.Cg(scaled, 'kern') * 'mu' * l.Cg(l.Cc(99), 'subtype') * l.Cg(l.Cc'kern', 'id') - + '\\kern' * l.Cg(' ' * l.Cc(1) + l.Cc(0), 'subtype') * l.Cg(scaled, 'kern') * (' (for ' * (l.R'az' + l.S'/\\') * ')')^-1 * l.Cg(l.Cc'kern', 'id') + + '\\glue(\\mskip)' * l.Cg(l.Cc(99), 'subtype') + * ' ' * l.Cg(scaled, 'width') * 'mu' + * (' plus ' * l.Cg(scaled, 'stretch') * l.Cg(glue_order_mu, 'stretch_order') + l.Cg(l.Cc(0), 'stretch') * l.Cg(l.Cc(0), 'stretch_order')) + * (' minus ' * l.Cg(scaled, 'shrink') * l.Cg(glue_order_mu, 'shrink_order') + l.Cg(l.Cc(0), 'shrink') * l.Cg(l.Cc(0), 'shrink_order')) + * l.Cg(l.Cc'glue', 'id') ) * -1 ++ generic_simple_node -local box_node = '\\' * l.S'hv' * 'box(' +local simple_text = l.Ct( + '\\math' * l.Cg( + 'on' * l.Cc(0) + + 'off' * l.Cc(6) + , 'subtype') * l.Cg(', surrounded ' * scaled + l.Cc(0), 'surround') * l.Cg(l.Cc'math', 'id') + ) * -1 ++ generic_simple_node + +local box_node = l.Ct('\\' * l.Cg('h' * l.Cc'hlist' + + 'v' * l.Cc'vlist') * 'box' + * hdw + * (', glue set ' * l.Cg('- ' * l.Cc(2) + l.Cc(1), 'glue_sign') + * l.Cg(scaled/function (s) return s/65536 end, 'glue_set') + * l.Cg(glue_order, 'glue_order') + + l.Cg(l.Cc(0), 'glue_sign') * l.Cg(l.Cc(0), 'glue_set') * l.Cg(l.Cc(0), 'glue_order')) + * l.Cg(', shifted ' * scaled + l.Cc(0), 'shift')) * -1 local fraction_noad = l.Ct('\\fraction, thickness ' * l.Cg('= default' * l.Cc(0x40000000) + scaled, 'width') From ddaf56b8af0eb62cf6223d58ed99e1531f4d861a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 4 Jul 2021 01:37:17 +0200 Subject: [PATCH 077/206] Fix typos --- luamml-demo.sty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luamml-demo.sty b/luamml-demo.sty index 08748d3..77215ac 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -2,7 +2,7 @@ \ProvidesPackage{luamml-demo}[2021-06-16 Reasonable default definitions for luamml] \RequirePackage{luamml}% Loading luamml is pretty much the point -\RequirePackage{amsmath,array}% AThese are more or less exepcted in luamml especially for advanced constructs +\RequirePackage{amsmath,array}% These are more or less expected in luamml especially for advanced constructs \AtBeginDocument{% \@ifpackageloaded{unicode-math}{}{% From 54ce65a04d6693822bbfdb0e88c46139a79aea81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 4 Jul 2021 03:17:18 +0200 Subject: [PATCH 078/206] Add luamml-pdf-demo --- luamml-demo.sty | 16 +++++++++------ luamml-pdf-demo.sty | 50 +++++++++++++++++++++++++++++++++++++++++++++ test_pdf.tex | 22 ++------------------ 3 files changed, 62 insertions(+), 26 deletions(-) create mode 100644 luamml-pdf-demo.sty diff --git a/luamml-demo.sty b/luamml-demo.sty index 77215ac..c68620c 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -1,5 +1,13 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{luamml-demo}[2021-06-16 Reasonable default definitions for luamml] +\ProvidesExplPackage{luamml-demo}{2021-06-16}{v0.0.1}{Reasonable default definitions for luamml} + +\sys_if_engine_luatex:F { + \msg_new:nnn {luamml-demo} {pdftex-option-ignored} {Option~`#1'~is~being~ignored~in~pdfTeX~mode.} + \DeclareOption*{\msg_warning:nnx {luamml-demo} {pdftex-option-ignored} {\CurrentOption}} + \ProcessOptions\relax + \RequirePackage{luamml-pdf-demo} + \endinput +} \RequirePackage{luamml}% Loading luamml is pretty much the point \RequirePackage{amsmath,array}% These are more or less expected in luamml especially for advanced constructs @@ -12,8 +20,6 @@ } } -\ExplSyntaxOn - \bool_new:N \l__luamml_demo_structelem_bool \DeclareOption{tracing}{ @@ -65,6 +71,4 @@ }{#2}{#3} } -\ExplSyntaxOff - -\endinput +\cs_set_eq:NN \WriteoutFormula \luamml_pdf_write: diff --git a/luamml-pdf-demo.sty b/luamml-pdf-demo.sty new file mode 100644 index 0000000..0cd981d --- /dev/null +++ b/luamml-pdf-demo.sty @@ -0,0 +1,50 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesExplPackage{luamml-pdf-demo}{2021-06-16}{v0.0.1}{Reasonable default definitions for luamml-pdf} + +\RequirePackage{luamml-pdf}% Loading luamml-pdf is pretty much the point +% \RequirePackage{amsmath,array}% May come back if the patches get ported + +% Delay family mappings to allow for replacements +\AddToHook{begindocument/before}{% + \@ifpackageloaded{unicode-math}{}{% + \RegisterFamilyMapping\symsymbols{oms}% + \RegisterFamilyMapping\symletters{oml}% + \RegisterFamilyMapping\symlargesymbols{omx}% + } +} + +\cs_new_protected:Npn \LuaMMLSetFilename #1 {} + +% TODO. +% \cs_generate_variant:Nn \pdffile_filespec:nnn {ene} +% \int_new:N \g__luamml_demo_af_int +% \cs_new_protected:Npn \LuaMMLTagAF #1#2 { +% \int_gincr:N \g__luamml_demo_af_int +% \exp_args:Ne \pdf_object_new:nn{__luamml_demo_\int_use:N \g__luamml_demo_af_int}{dict} +% \exp_args:Ne \tagstructbegin{tag=Formula,AF=__luamml_demo_\int_use:N \g__luamml_demo_af_int,#1} +% \bool_if:NF \l__luamml_demo_structelem_bool { +% \tagmcbegin{tag=Formula} +% } +% #2 +% \group_begin: +% \pdfdict_put:nnn {l_pdffile/Filespec} {AFRelationship}{/Supplement} +% \pdffile_filespec:ene +% { __luamml_demo_ \int_use:N \g__luamml_demo_af_int } +% { test.xml } +% { \luamml_get_last_mathml_stream:e{}\c_space_tl 0~R} +% \group_end: +% \bool_if:NF \l__luamml_demo_structelem_bool { +% \tagmcend +% } +% \tagstructend +% } + +\NewDocumentCommand\AnnotateFormula{ o m m }{% + \IfValueTF{#1}{% + \luamml_annotate:nen{#1}% + }{ + \luamml_annotate:en + }{#2}{#3} +} + +\cs_set_eq:NN \WriteoutFormula \luamml_pdf_write: diff --git a/test_pdf.tex b/test_pdf.tex index be80b1c..c125b4e 100644 --- a/test_pdf.tex +++ b/test_pdf.tex @@ -1,24 +1,6 @@ \documentclass{article} -\usepackage{luamml-pdf} - -\RegisterFamilyMapping\symsymbols{oms} -\RegisterFamilyMapping\symletters{oml} -\RegisterFamilyMapping\symlargesymbols{omx} - -\ExplSyntaxOn -\cs_set_eq:NN \WriteoutFormula \luamml_pdf_write: -\NewDocumentCommand\AnnotateFormula{ o m m }{% - \IfValueTF{#1}{% - \luamml_annotate:nen{#1}% - }{ - \luamml_annotate:en - }{#2}{#3} -} -\ExplSyntaxOff - -\protected\edef\models{\AnnotateFormula{% - nucleus = true, core = {[0] = 'mi', '\noexpand\string\noexpand\u{22a7}'}, - }{\unexpanded\expandafter{\models}}} +\usepackage{amsmath} +\usepackage[files]{luamml-demo} \begin{document} \[ From 5b9066eb26cb6180ecee671a8f5830f410dbd415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 4 Jul 2021 03:18:36 +0200 Subject: [PATCH 079/206] Normalize parser --- pdfmml-showlists.lua | 58 ++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/pdfmml-showlists.lua b/pdfmml-showlists.lua index f4af647..4d74be1 100644 --- a/pdfmml-showlists.lua +++ b/pdfmml-showlists.lua @@ -40,10 +40,10 @@ local math_char = l.Ct('\\fam' * l.Cg(l.R'09'^1 / tonumber, 'fam') * ' ' * l.Cg( local hdw = '(' * l.Cg(scaled + '*' * l.Cc(-0x40000000), 'height') * '+' * l.Cg(scaled + '*' * l.Cc(-0x40000000), 'depth') * ')x' * l.Cg(scaled + '*' * l.Cc(-0x40000000), 'width') -local generic_simple_node = l.Ct( - '\\' * l.Cg('rule', 'id') * hdw - + '\\kern' * l.Cg(' ' * l.Cc(1) + l.Cc(0), 'subtype') * l.Cg(scaled, 'kern') * (' (for ' * (l.R'az' + l.S'/\\') * ')')^-1 * l.Cg(l.Cc'kern', 'id') - + '\\glue' * l.Cg('(\\' * ( +local generic_simple_node = l.Ct('\\' * ( + l.Cg('rule', 'id') * hdw + + l.Cg('kern', 'id') * l.Cg(' ' * l.Cc(1) + l.Cc(0), 'subtype') * l.Cg(scaled, 'kern') * (' (for ' * (l.R'az' + l.S'/\\') * ')')^-1 + + l.Cg('glue', 'id') * l.Cg('(\\' * ( 'line' * l.Cc(1) + 'baseline' * l.Cc(2) + 'par' * l.Cc(3) @@ -66,13 +66,12 @@ local generic_simple_node = l.Ct( * ' ' * l.Cg(scaled, 'width') * (' plus ' * l.Cg(scaled, 'stretch') * l.Cg(glue_order, 'stretch_order') + l.Cg(l.Cc(0), 'stretch') * l.Cg(l.Cc(0), 'stretch_order')) * (' minus ' * l.Cg(scaled, 'shrink') * l.Cg(glue_order, 'shrink_order') + l.Cg(l.Cc(0), 'shrink') * l.Cg(l.Cc(0), 'shrink_order')) - * l.Cg(l.Cc'glue', 'id') - + '\\penalty ' * l.Cg(int, 'penalty') * l.Cg(l.Cc'penalty', 'id') - + '\\mark' * l.Cg('s' * int + l.Cc(0), 'class') * l.Cg(balanced_braces, 'mark') * l.Cg(l.Cc'mark', 'id') -) * -1 + + l.Cg('penalty', 'id') * ' ' * l.Cg(int, 'penalty') + + l.Cg('mark', 'id') * l.Cg('s' * int + l.Cc(0), 'class') * l.Cg(balanced_braces, 'mark') +)) * -1 -local simple_noad = l.Ct( - '\\math' * l.Cg( +local simple_noad = l.Ct('\\' * ( + 'math' * l.Cg( 'ord' * l.Cc(0) + 'open' * l.Cc(6) + 'op\\limits' * l.Cc(2) @@ -87,35 +86,36 @@ local simple_noad = l.Ct( + 'over' * l.Cc(11) + 'vcenter' * l.Cc(12) , 'subtype') * l.Cg(l.Cc'noad', 'id') - + '\\radical' * l.Cg(delimiter_code, 'left') * l.Cg(l.Cc(0), 'subtype') * l.Cg(l.Cc'radical', 'id') - + '\\accent' * l.Cg(math_char, 'accent') * l.Cg(l.Cc(0), 'subtype') * l.Cg(l.Cc'accent', 'id') - + l.Cg('\\left' * l.Cc(1) - + '\\middle' * l.Cc(2) - + '\\right' * l.Cc(3), 'subtype') * l.Cg(delimiter_code, 'delim') + + l.Cg('radical', 'id') * l.Cg(delimiter_code, 'left') * l.Cg(l.Cc(0), 'subtype') + + l.Cg('accent', 'id') * l.Cg(math_char, 'accent') * l.Cg(l.Cc(0), 'subtype') + + l.Cg('left' * l.Cc(1) + + 'middle' * l.Cc(2) + + 'right' * l.Cc(3), 'subtype') * l.Cg(delimiter_code, 'delim') * l.Cg(l.Cc(0), 'options') * l.Cg(l.Cc(0), 'height') * l.Cg(l.Cc(0), 'depth') * l.Cg(l.Cc(0), 'height') * l.Cg(l.Cc(-1), 'class') * l.Cg(l.Cc'fence', 'id') - + '\\' * l.Cg( + + l.Cg( 'display' * l.Cc(0) + 'text' * l.Cc(2) + 'scriptscript' * l.Cc(6) + 'script' * l.Cc(4), 'subtype') * l.Cg('style', 'id') - + '\\glue(\\nonscript)' * l.Cg(l.Cc(98), 'subtype') * l.Cg(l.Cc'glue', 'id') - + '\\mkern' * l.Cg(scaled, 'kern') * 'mu' * l.Cg(l.Cc(99), 'subtype') * l.Cg(l.Cc'kern', 'id') - + '\\glue(\\mskip)' * l.Cg(l.Cc(99), 'subtype') - * ' ' * l.Cg(scaled, 'width') * 'mu' - * (' plus ' * l.Cg(scaled, 'stretch') * l.Cg(glue_order_mu, 'stretch_order') + l.Cg(l.Cc(0), 'stretch') * l.Cg(l.Cc(0), 'stretch_order')) - * (' minus ' * l.Cg(scaled, 'shrink') * l.Cg(glue_order_mu, 'shrink_order') + l.Cg(l.Cc(0), 'shrink') * l.Cg(l.Cc(0), 'shrink_order')) - * l.Cg(l.Cc'glue', 'id') - ) * -1 + + 'm' * l.Cg('kern', 'id') * l.Cg(scaled, 'kern') * 'mu' * l.Cg(l.Cc(99), 'subtype') + + l.Cg('glue', 'id') * ( + '(\\nonscript)' * l.Cg(l.Cc(98), 'subtype') + + '(\\mskip)' * l.Cg(l.Cc(99), 'subtype') + * ' ' * l.Cg(scaled, 'width') * 'mu' + * (' plus ' * l.Cg(scaled, 'stretch') * l.Cg(glue_order_mu, 'stretch_order') + l.Cg(l.Cc(0), 'stretch') * l.Cg(l.Cc(0), 'stretch_order')) + * (' minus ' * l.Cg(scaled, 'shrink') * l.Cg(glue_order_mu, 'shrink_order') + l.Cg(l.Cc(0), 'shrink') * l.Cg(l.Cc(0), 'shrink_order')) + ) + )) * -1 + generic_simple_node -local simple_text = l.Ct( - '\\math' * l.Cg( +local simple_text = l.Ct('\\' * ( + l.Cg('math', 'id') * l.Cg( 'on' * l.Cc(0) - + 'off' * l.Cc(6) - , 'subtype') * l.Cg(', surrounded ' * scaled + l.Cc(0), 'surround') * l.Cg(l.Cc'math', 'id') - ) * -1 + + 'off' * l.Cc(1) + , 'subtype') * l.Cg(', surrounded ' * scaled + l.Cc(0), 'surround') + )) * -1 + generic_simple_node local box_node = l.Ct('\\' * l.Cg('h' * l.Cc'hlist' From cfae79975e9d7372db694b1c505a7823ff2483c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 31 Oct 2021 16:06:29 +0100 Subject: [PATCH 080/206] Use l3build for testing --- build.lua | 6 +- config-lua.lua | 4 + config-pdf.lua | 33 ++++ testfiles-pdf/test.mlr | 51 ++++++ test_pdf.tex => testfiles-pdf/test.mlt | 2 +- testfiles-pdf/test_pdf.txr | 218 +++++++++++++++++++++++++ testfiles-pdf/test_pdf.xrt | 20 +++ 7 files changed, 332 insertions(+), 2 deletions(-) create mode 100644 config-lua.lua create mode 100644 config-pdf.lua create mode 100644 testfiles-pdf/test.mlr rename test_pdf.tex => testfiles-pdf/test.mlt (91%) create mode 100644 testfiles-pdf/test_pdf.txr create mode 100644 testfiles-pdf/test_pdf.xrt diff --git a/build.lua b/build.lua index f5e1bf1..1485bf5 100644 --- a/build.lua +++ b/build.lua @@ -4,6 +4,10 @@ tdsroot = "lualatex" installfiles = { "luamml-*.lua", "*.sty" } sourcefiles = { "luamml-*.lua", "*.sty", "*.dtx" } stdengine = "luatex" -checkengines = {"luatex"} unpackfiles = { "*.dtx" } typesetexe = "lualatex" + +checkconfigs = { + 'config-lua', + 'config-pdf', +} diff --git a/config-lua.lua b/config-lua.lua new file mode 100644 index 0000000..119e608 --- /dev/null +++ b/config-lua.lua @@ -0,0 +1,4 @@ +testfiledir = "testfiles-lua" +checkengines = {"luatex"} +stdengine = "luatex" +checkruns = 3 diff --git a/config-pdf.lua b/config-pdf.lua new file mode 100644 index 0000000..1fc73e1 --- /dev/null +++ b/config-pdf.lua @@ -0,0 +1,33 @@ +testfiledir = "testfiles-pdf" +checkengines = {"pdftex"} +stdengine = "pdftex" +checkruns = 3 + +test_types = test_types or {} +test_types.tml = { + test = '.xrt', + generated = '.tml', + reference = '.txr', + expectation = '.xre', + rewrite = function(source, result, engine, errlevels) + local file = assert(io.open(source,"rb")) + local content = string.gsub(file:read("*all") .. "\n","\r\n","\n") + file:close() + local new_content = content + -- local new_content = processor(content,...) + local newfile = io.open(result,"w") + newfile:write(new_content) + newfile:close() + end, +} +test_types.mml = { + test = '.mlt', + generated = '.tml', + reference = '.mlr', + expectation = '.mle', + rewrite = function(source, result, engine, errlevels) + return os.execute(string.format('texlua pdfmml.lua "%s" | tidy -xml -indent -wrap -quiet --output-file "%s" -', source, result)) + end, +} + +test_order = {'log', 'pdf', 'tml', 'mml'} diff --git a/testfiles-pdf/test.mlr b/testfiles-pdf/test.mlr new file mode 100644 index 0000000..d0165a8 --- /dev/null +++ b/testfiles-pdf/test.mlr @@ -0,0 +1,51 @@ + + โˆ… + โŠง + ( + ( + ๐‘ + โ‡’ + ๐‘ž + ) + โ‡’ + ( + ๐‘ž + โ‡’ + ๐‘Ÿ + ) + ) + โ‡’ + ( + ๐‘ + โ‡’ + ( + ๐‘ž + โ‡’ + ๐‘Ÿ + ) + ) + + + + s + i + n + + ( + ๐‘ฅ + ) + โˆ’ + + s + i + n + + ( + ๐‘ฅ + + + 2 + ๐œ‹ + ) + = + 0 + diff --git a/test_pdf.tex b/testfiles-pdf/test.mlt similarity index 91% rename from test_pdf.tex rename to testfiles-pdf/test.mlt index c125b4e..76a0e75 100644 --- a/test_pdf.tex +++ b/testfiles-pdf/test.mlt @@ -1,6 +1,6 @@ \documentclass{article} \usepackage{amsmath} -\usepackage[files]{luamml-demo} +\usepackage{luamml-demo} \begin{document} \[ diff --git a/testfiles-pdf/test_pdf.txr b/testfiles-pdf/test_pdf.txr new file mode 100644 index 0000000..c203661 --- /dev/null +++ b/testfiles-pdf/test_pdf.txr @@ -0,0 +1,218 @@ +LUAMML_INSTRUCTION:REGISTER_MAPPING:2:oms +LUAMML_INSTRUCTION:REGISTER_MAPPING:1:oml +LUAMML_INSTRUCTION:REGISTER_MAPPING:3:omx +LUAMML_MARK:1:count=3,nucleus=true,core={[0]='mi','\u{22a7}'}, +LUAMML_MARK_END +LUAMML_FORMULA_BEGIN:1:3:mrow: + + + +### display math mode entered at line 6 +\mathord +.\fam2 ; +\write3{LUAMML_MARK_REF:1:} +\mathrel +.\fam2 j +\mathrel +.\mkern-3.0mu +\mathrel +.\fam0 = +\mathopen +.\fam0 ( +\mathopen +.\fam0 ( +\mathord +.\fam1 p +\mathrel +.\fam2 ) +\mathord +.\fam1 q +\mathclose +.\fam0 ) +\mathrel +.\fam2 ) +\mathopen +.\fam0 ( +\mathord +.\fam1 q +\mathrel +.\fam2 ) +\mathord +.\fam1 r +\mathclose +.\fam0 ) +\mathclose +.\fam0 ) +\mathrel +.\fam2 ) +\mathopen +.\fam0 ( +\mathord +.\fam1 p +\mathrel +.\fam2 ) +\mathopen +.\fam0 ( +\mathord +.\fam1 q +\mathrel +.\fam2 ) +\mathord +.\fam1 r +\mathclose +.\fam0 ) +\mathclose +.\fam0 ) + +### vertical mode entered at line 0 +### current page: +\write-{} +\glue(\topskip) 10.0 +\hbox(0.0+0.0)x345.0, glue set 330.0fil +.\hbox(0.0+0.0)x15.0 +.\penalty 10000 +.\glue(\parfillskip) 0.0 plus 1.0fil +.\glue(\rightskip) 0.0 + +total height 10.0 + goal height 550.0 + +prevdepth 0.0, prevgraf 1 line + + +! OK +LUAMML_FORMULA_END +LUAMML_FORMULA_BEGIN:2:3:mrow: + + + +### math mode entered at line 18 +\mathop\nolimits +.\kern 0.0 +.\mathord +..\fam0 s +.\mathord +..\fam0 i +.\mathord +..\fam0 n +\mathopen +.\fam0 ( +\mathord +.\fam1 x +\mathclose +.\fam0 ) +\mathbin +.\fam2 ^^@ +\mathop\nolimits +.\kern 0.0 +.\mathord +..\fam0 s +.\mathord +..\fam0 i +.\mathord +..\fam0 n +\mathopen +.\fam0 ( +\mathord +.\fam1 x +\mathbin +.\fam0 + +\mathord +.\fam0 2 +\mathord +.\fam1 ^^Y +\mathclose +.\fam0 ) +\mathrel +.\fam0 = +\mathord +.\fam0 0 + +### horizontal mode entered at line 18 +\hbox(0.0+0.0)x15.0 +\OT1/cmr/m/n/10 E +\OT1/cmr/m/n/10 s +\glue 3.33333 plus 1.66666 minus 1.11111 +\OT1/cmr/m/n/10 g +\OT1/cmr/m/n/10 i +\OT1/cmr/m/n/10 l +\OT1/cmr/m/n/10 t +\glue 3.33333 plus 1.66666 minus 1.11111 + +spacefactor 1000 +### vertical mode entered at line 0 +### current page: +\write-{} +\glue(\topskip) 10.0 +\hbox(0.0+0.0)x345.0, glue set 330.0fil +.\hbox(0.0+0.0)x15.0 +.\penalty 10000 +.\glue(\parfillskip) 0.0 plus 1.0fil +.\glue(\rightskip) 0.0 +\penalty 10000 +\glue(\abovedisplayshortskip) 0.0 plus 3.0 +\glue(\baselineskip) 4.5 +\hbox(7.5+2.5)x185.77597, shifted 79.61201, display +.\OMS/cmsy/m/n/10 ; +.\write3{LUAMML_MARK_REF:1:} +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OMS/cmsy/m/n/10 j +.\hbox(0.0+0.0)x-1.66663 +..\kern -1.66663 +.\OT1/cmr/m/n/10 = +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OT1/cmr/m/n/10 ( +.\OT1/cmr/m/n/10 ( +.\OML/cmm/m/it/10 p +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OMS/cmsy/m/n/10 ) +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OML/cmm/m/it/10 q +.\kern0.35878 +.\OT1/cmr/m/n/10 ) +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OMS/cmsy/m/n/10 ) +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OT1/cmr/m/n/10 ( +.\OML/cmm/m/it/10 q +.\kern0.35878 +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OMS/cmsy/m/n/10 ) +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OML/cmm/m/it/10 r +.\kern0.27779 +.\OT1/cmr/m/n/10 ) +.\OT1/cmr/m/n/10 ) +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OMS/cmsy/m/n/10 ) +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OT1/cmr/m/n/10 ( +.\OML/cmm/m/it/10 p +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OMS/cmsy/m/n/10 ) +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OT1/cmr/m/n/10 ( +.\OML/cmm/m/it/10 q +.\kern0.35878 +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OMS/cmsy/m/n/10 ) +.\glue(\thickmuskip) 2.77771 plus 2.77771 +.\OML/cmm/m/it/10 r +.\kern0.27779 +.\OT1/cmr/m/n/10 ) +.\OT1/cmr/m/n/10 ) +\penalty 0 +\glue(\belowdisplayshortskip) 6.0 plus 3.0 minus 3.0 +\glue(\parskip) 0.0 plus 1.0 +\glue(\parskip) 0.0 + +total height 30.5 plus 7.0 minus 3.0 + goal height 550.0 + +prevdepth 2.5 + + +! OK +LUAMML_FORMULA_END +LUAMML_MARK_REF:1: + diff --git a/testfiles-pdf/test_pdf.xrt b/testfiles-pdf/test_pdf.xrt new file mode 100644 index 0000000..76a0e75 --- /dev/null +++ b/testfiles-pdf/test_pdf.xrt @@ -0,0 +1,20 @@ +\documentclass{article} +\usepackage{amsmath} +\usepackage{luamml-demo} + +\begin{document} +\[ + \emptyset\models((p\Rightarrow q)\Rightarrow(q\Rightarrow r))\Rightarrow (p\Rightarrow (q\Rightarrow r)) + \WriteoutFormula +\] + +%\begin{align} +% abc&=def & e^{\mathrm{i}\pi}&=-1\\ +% \Big(1+2&=3\Big)\\ +% &4\\ +% 5 +%\end{align} + +Es gilt $\sin(x)-\sin(x+2\pi)=0\WriteoutFormula$. +\end{document} + From 8ddc9aeebc0ff7c6cd4ff47dd578d6fb9e892ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 31 Oct 2021 17:18:23 +0100 Subject: [PATCH 081/206] l3build for Lua testing --- config-lua.lua | 13 +++++++++++++ luamml-demo.sty | 6 ++++++ luamml-tex.lua | 39 ++++++++++++++++++++++++++++++++------- luamml.dtx | 6 ++++++ 4 files changed, 57 insertions(+), 7 deletions(-) diff --git a/config-lua.lua b/config-lua.lua index 119e608..22e287b 100644 --- a/config-lua.lua +++ b/config-lua.lua @@ -2,3 +2,16 @@ testfiledir = "testfiles-lua" checkengines = {"luatex"} stdengine = "luatex" checkruns = 3 + +test_types = test_types or {} +test_types.mml = { + test = '.mlt', + generated = '.mml', + reference = '.mlr', + expectation = '.mle', + rewrite = function(source, result, engine, errlevels) + return os.execute(string.format('tidy -xml -indent -wrap -quiet --output-file "%s" "%s"', result, source)) + end, +} + +test_order = {'log', 'pdf', 'mml'} diff --git a/luamml-demo.sty b/luamml-demo.sty index c68620c..eb4ee9c 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -36,6 +36,12 @@ \jobname -formula- \int_use:N \g__luamml_demo_mathml_int .xml } } +\DeclareOption{l3build}{ + \luamml_set_filename:n { + \jobname .mml + } + \luamml_begin_single_file: +} \ProcessOptions\relax \cs_new_eq:NN \LuaMMLSetFilename \luamml_set_filename:n diff --git a/luamml-tex.lua b/luamml-tex.lua index 49f645a..c391a0a 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -66,6 +66,8 @@ end -- Bit 1: Save MathML as a fully converted formula -- Bit 0: Save MathML for later usage in startmath node. Ignored for display math. +local out_file + local mlist_result local undefined_cmd = token.command_id'undefined_cs' @@ -75,14 +77,18 @@ local labelled_mathml = {} local function save_result(xml, display, structelem) mlist_result = make_root(xml, display and 0 or 2) - token.put_next(filename_token) - local filename = token.scan_argument() - local tracing = tex.count.tracingmathml > 1 - if filename ~= '' then - assert(io.open(filename, 'w')) - :write(write_xml(mlist_result, true):sub(2) .. '\n') - :close() + if out_file then + out_file:write(write_xml(mlist_result, true):sub(2) .. '\n') + else + token.put_next(filename_token) + local filename = token.scan_argument() + if filename ~= '' then + assert(io.open(filename, 'w')) + :write(write_xml(mlist_result, true):sub(2) .. '\n') + :close() + end end + local tracing = tex.count.tracingmathml > 1 if tracing then texio.write_nl(write_xml(mlist_result) .. '\n') end @@ -159,6 +165,25 @@ lua.get_functions_table()[funcid] = function() mlist_result = nil end +funcid = luatexbase.new_luafunction'luamml_begin_single_file:' +token.set_lua('luamml_begin_single_file:', funcid, protected) +lua.get_functions_table()[funcid] = function() + token.put_next(filename_token) + local filename = token.scan_argument() + if filename ~= '' then + out_file = assert(io.open(filename, 'w')) + end +end + +funcid = luatexbase.new_luafunction'luamml_end_single_file:' +token.set_lua('luamml_end_single_file:', funcid, protected) +lua.get_functions_table()[funcid] = function() + if out_file then + out_file:close() + out_file = nil + end +end + local annotate_context = require'luamml-tex-annotate' annotate_context.data.mathml = labelled_mathml diff --git a/luamml.dtx b/luamml.dtx index e577199..4d6f84e 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -227,6 +227,12 @@ } % % \end{macrocode} +% +% \begin{macro}{\luamml_begin_single_file:, \luamml_end_single_file:} +% Everything between these two commands gets written into the same XML file. +% The filename is expanded when \cs{luamml_begin_single_file:} gets executed. +% +% (Implemented in Lua) % \end{macro} % % By default, the flag is set to assume complete formulas. From d1ef3292ee2860dd311700ce135682b999cc47ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 31 Oct 2021 17:52:34 +0100 Subject: [PATCH 082/206] Adapt to new tagpdf versions --- luamml-structelemwriter.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index bd0a59f..d74513d 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -35,8 +35,8 @@ local attributes = setmetatable({}, {__index = function(t, k) return attr_name end}) -local mc_type = token.create'l__tag_mc_type_attr'.index -local mc_cnt = token.create'l__tag_mc_cnt_attr'.index +local mc_type = luatexbase.attributes.g__tag_mc_type_attr +local mc_cnt = luatexbase.attributes.g__tag_mc_cnt_attr -- print('!!!', mc_type, mc_cnt) local stash_cnt = 0 From c6a180cd1aa3c7a1666bf260b7d6de79556592f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 31 Oct 2021 23:12:42 +0100 Subject: [PATCH 083/206] Use Attribute NameSpace and add missing test files --- luamml-structelemwriter.lua | 8 +- testfiles-lua/test_struct.pvt | 56 ++ testfiles-lua/test_struct.tpf | 1758 +++++++++++++++++++++++++++++++++ testfiles-lua/test_xml.mlr | 229 +++++ testfiles-lua/test_xml.mlt | 53 + 5 files changed, 2100 insertions(+), 4 deletions(-) create mode 100644 testfiles-lua/test_struct.pvt create mode 100644 testfiles-lua/test_struct.tpf create mode 100644 testfiles-lua/test_xml.mlr create mode 100644 testfiles-lua/test_xml.mlt diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index d74513d..eb266a1 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -25,10 +25,10 @@ local attributes = setmetatable({}, {__index = function(t, k) local attr_name = string.format('luamml_attr_%i', attribute_counter) t[k] = attr_name tex.runtoks(function() - -- tex.sprint(string.format('\\tagpdfsetup{newattribute={%s}{/O/NSO/NS %i 0 R', - -- attr_name, mathml_ns_obj or get_mathml_ns_obj())) - tex.sprint(string.format('\\tagpdfsetup{newattribute={%s}{/O/MathML-3', - attr_name)) + tex.sprint(string.format('\\tagpdfsetup{newattribute={%s}{/O/NSO/NS %i 0 R', + attr_name, mathml_ns_obj or get_mathml_ns_obj())) + -- tex.sprint(string.format('\\tagpdfsetup{newattribute={%s}{/O/MathML-3', + -- attr_name)) tex.cprint(12, k) tex.sprint'}}' end) diff --git a/testfiles-lua/test_struct.pvt b/testfiles-lua/test_struct.pvt new file mode 100644 index 0000000..bfc1ae0 --- /dev/null +++ b/testfiles-lua/test_struct.pvt @@ -0,0 +1,56 @@ +\ExplSyntaxOn +\sys_gset_rand_seed:n{1000} +\ExplSyntaxOff +\RequirePackage{pdfmanagement-testphase} +\DeclareDocumentMetadata{ + uncompress, + pdfversion = 2.0, +} +\documentclass{article} +\usepackage{tagpdf} +\usepackage[structelem]{luamml-demo} +\tagpdfsetup{ + activate-all, + interwordspace=true, +} + +\usepackage{unicode-math} + +\begin{document} +\tagstructbegin{tag=Document} +\LuaMMLTagAF{} { +\[ + \begin{pmatrix} + 1 & 0 & 0 \\ + 0 & 1 & 0 \\ + 0 & 0 & 1 + \end{pmatrix} + = + \begin{cases} + 1 & $if $a=b\\ + 2 & $else$ + \end{cases} +\] +} +\LuaMMLTagAF{} { +\[ + x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}. +\] +} +\LuaMMLTagAF{} { +\[ + \sum_a\underline c\dot bc' +\] +} + +\LuaMMLTagAF{} { +\begin{align} + abc&=def & e^{\mathrm{i}\pi}&=-1\\ + \Big(1+2&=3\Big)\\ + 5 +\end{align} +} + +Es gilt \LuaMMLTagAF{}{$\sin(x)-\sin(x+2\pi)=0$}. +\tagstructend +\end{document} diff --git a/testfiles-lua/test_struct.tpf b/testfiles-lua/test_struct.tpf new file mode 100644 index 0000000..c772311 --- /dev/null +++ b/testfiles-lua/test_struct.tpf @@ -0,0 +1,1758 @@ +%PDF-2.0 +%ฬีมิลุะฤฦ +42 0 obj +<< /O/NSO/NS 13 0 R/width(9.963pt) >> +endobj +44 0 obj +<< /O/NSO/NS 13 0 R/intent(@ignore) >> +endobj +48 0 obj +<< /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0.278em) >> +endobj +56 0 obj +<< /O/NSO/NS 13 0 R/display(block) >> +endobj +59 0 obj +<< /O/NSO/NS 13 0 R/fence(true)/lspace(0)/rspace(0)/symmetric(true) >> +endobj +61 0 obj +<< /O/NSO/NS 13 0 R/width(-4.981pt) >> +endobj +63 0 obj +<< /O/NSO/NS 13 0 R/lspace(+4.981pt)/width(+9.963pt) >> +endobj +77 0 obj +<< /O/NSO/NS 13 0 R/columnalign(left) >> +endobj +83 0 obj +<< /O/NSO/NS 13 0 R/width(1.196pt) >> +endobj +84 0 obj +<> +stream +(100010001)={1ifย ๐‘Ž=๐‘2else +endstream +endobj +18 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +endobj +93 0 obj +<< /O/NSO/NS 13 0 R/lspace(0)/rspace(0.222em) >> +endobj +96 0 obj +<< /O/NSO/NS 13 0 R/lspace(0.222em)/rspace(0.222em) >> +endobj +110 0 obj +<< /O/NSO/NS 13 0 R/lspace(0)/rspace(0) >> +endobj +111 0 obj +<> +stream +๐‘ฅ=โˆ’๐‘ยฑ๐‘2โˆ’4๐‘Ž๐‘2๐‘Ž. +endstream +endobj +85 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +endobj +117 0 obj +<< /O/NSO/NS 13 0 R/lspace(0)/movablelimits(true)/rspace(0.167em) >> +endobj +125 0 obj +<< /O/NSO/NS 13 0 R/stretchy(true) >> +endobj +129 0 obj +<< /O/NSO/NS 13 0 R/mathvariant(normal) >> +endobj +130 0 obj +<> +stream +โˆ‘๐‘Ž๐‘_๐‘.๐‘โ€ฒ +endstream +endobj +112 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +endobj +152 0 obj +<< /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0) >> +endobj +157 0 obj +<< /O/NSO/NS 13 0 R/fence(true)/lspace(0)/maxsize(17.861pt)/minsize(17.861pt)/rspace(0)/symmetric(true) >> +endobj +180 0 obj +<< /O/NSO/NS 13 0 R/columnalign(right left right left)/columnspacing(0 .8em 0)/displaystyle(true) >> +endobj +190 0 obj +<> +stream +(1)๐‘Ž๐‘๐‘=๐‘‘๐‘’๐‘“๐‘’i๐œ‹=โˆ’1(2)(1+2=3)(3)5 +endstream +endobj +131 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +endobj +199 0 obj +<< /O/NSO/NS 13 0 R/lspace(0)/rspace(0)/stretchy(false) >> +endobj +215 0 obj +<> +stream +sin(๐‘ฅ)โˆ’sin(๐‘ฅ+2๐œ‹)=0 +endstream +endobj +191 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +endobj +218 0 obj +<< /Length 7986 >> +stream +/opacity1 gs +/Artifact BMC +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 244.284 689.457 Tm [<09C9>]TJ +1 0 0 1 244.284 685.715 Tm [<09C8>]TJ +1 0 0 1 244.284 672.041 Tm [<09C7>]TJ +ET +EMC +/Artifact BMC +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 253.001 697.76 Tm [<0012>]TJ +ET +EMC +/Artifact BMC +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 267.945 697.76 Tm [<0011>]TJ +ET +EMC +/Artifact BMC +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 282.889 697.76 Tm [<0011>]TJ +ET +EMC +/Artifact BMC +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 253.001 685.805 Tm [<0011>]TJ +ET +EMC +/Artifact BMC +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 267.945 685.805 Tm [<0012>]TJ +ET +EMC +/Artifact BMC +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 282.889 685.805 Tm [<0011>]TJ +ET +EMC +/Artifact BMC +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 253.001 673.85 Tm [<0011>]TJ +ET +EMC +/Artifact BMC +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 267.945 673.85 Tm [<0011>]TJ +ET +EMC +/Artifact BMC +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 282.889 673.85 Tm [<0012>]TJ +ET +EMC +/Artifact BMC +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 287.871 689.457 Tm [<09CC>]TJ +1 0 0 1 287.871 685.715 Tm [<09CB>]TJ +1 0 0 1 287.871 672.041 Tm [<09CA>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 299.355 685.706 Tm [<001E>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 309.873 685.705 Tm [<09D3>]TJ +ET +EMC +/Artifact BMC +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 318.859 692.5 Tm [<0012>]TJ +ET +EMC +/Artifact BMC +BT +/F23 9.96264 Tf +1 0 0 1 333.803 692.5 Tm [<004200370067>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 342.939 692.5 Tm [<0510>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 350.976 692.5 Tm [<001E>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 361.494 692.5 Tm [<0511>]TJ +ET +EMC +/Artifact BMC +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 318.859 678.154 Tm [<0013>]TJ +ET +EMC +/Artifact BMC +BT +/F23 9.96264 Tf +1 0 0 1 333.803 678.154 Tm [<0032004800620032>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 259.389 646.021 Tm [<0527>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 267.855 646.021 Tm [<001E>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 279.569 652.765 Tm [<0A37>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 287.32 652.765 Tm [<0511>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 293.947 652.765 Tm [<0A3B>]TJ +ET +EMC +/Artifact BMC +BT +/F28 9.96264 Tf +1 0 0 1 303.911 661.496 Tm [<0C05>]TJ +ET +q +1 0 0 1 312.21 661.696 cm +[] 0 d 0 J 0.398 w 0 0 m 35.683 0 l S +Q +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 312.21 652.765 Tm [<0511>]TJ +ET +EMC +/mn<> BDC +BT +/F29 6.97385 Tf +1 0 0 1 316.624 655.644 Tm [<03F5>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 323.363 652.765 Tm [<0A37>]TJ +ET +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 333.328 652.765 Tm [<0015>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 338.309 652.765 Tm [<0510>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 343.579 652.765 Tm [<0512>]TJ +ET +EMC +/Artifact BMC +q +1 0 0 1 279.569 648.512 cm +[] 0 d 0 J 0.398 w 0 0 m 68.325 0 l S +Q +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 308.605 639.188 Tm [<0013>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 313.587 639.188 Tm [<0510>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 349.089 646.021 Tm [<000F>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 289.258 616.133 Tm [<0C02>]TJ +ET +EMC +/mi<> BDC +BT +/F29 6.97385 Tf +1 0 0 1 294.289 605.673 Tm [<057C>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 305.304 616.133 Tm [<0512>]TJ +ET +EMC +/Artifact BMC +q +1 0 0 1 305.304 614.629 cm +[] 0 d 0 J 0.398 w 0 0 m 4.314 0 l S +Q +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 313.902 618.564 Tm [<06FE>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 309.618 616.133 Tm [<0511>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 314.031 616.133 Tm [<0512>]TJ +ET +EMC +/mi<> BDC +BT +/F29 6.97385 Tf +1 0 0 1 318.594 619.749 Tm [<0BA5>]TJ +ET +EMC +/Artifact BMC +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 231.386 576.283 Tm [<0510>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 236.656 576.283 Tm [<0511>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 241.07 576.283 Tm [<0512>]TJ +ET +EMC +/Artifact BMC +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 248.151 576.283 Tm [<001E>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 258.669 576.283 Tm [<0513>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 264.088 576.283 Tm [<0514>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 268.731 576.283 Tm [<0515>]TJ +ET +EMC +/Artifact BMC +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 356.482 576.283 Tm [<0514>]TJ +ET +EMC +/mi<> BDC +BT +/F40 6.97385 Tf +1 0 0 1 361.124 579.899 Tm [<0042>]TJ +ET +EMC +/mi<> BDC +BT +/F29 6.97385 Tf +1 0 0 1 363.377 579.899 Tm [<11CE>]TJ +ET +EMC +/Artifact BMC +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 371.36 576.283 Tm [<001E>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 381.878 576.283 Tm [<0A37>]TJ +ET +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 389.629 576.283 Tm [<0012>]TJ +ET +EMC +/Artifact BMC +BT +/F23 9.96264 Tf +1 0 0 1 464.747 576.283 Tm [<005500520056>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 216.637 555.8 Tm [<0997>]TJ +ET +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 223.243 555.8 Tm [<0012>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 230.438 555.8 Tm [<000C>]TJ +ET +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 240.402 555.8 Tm [<0013>]TJ +ET +EMC +/Artifact BMC +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 248.151 555.8 Tm [<001E>]TJ +ET +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 258.669 555.8 Tm [<0014>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 263.65 555.8 Tm [<0998>]TJ +ET +EMC +/Artifact BMC +BT +/F23 9.96264 Tf +1 0 0 1 464.747 555.8 Tm [<0055006B0056>]TJ +ET +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 240.402 535.516 Tm [<0016>]TJ +ET +EMC +/Artifact BMC +BT +/F23 9.96264 Tf +1 0 0 1 464.747 535.516 Tm [<0055006A0056>]TJ +1 0 0 1 148.712 513.598 Tm [<003100620067003B0042004800690067>]TJ +ET +EMC +/mi<> BDC +BT +/F23 9.96264 Tf +1 0 0 1 180.453 513.598 Tm [<0062>]TJ +ET +EMC +/mi<> BDC +BT +/F23 9.96264 Tf +1 0 0 1 184.379 513.598 Tm [<0042>]TJ +ET +EMC +/mi<> BDC +BT +/F23 9.96264 Tf +1 0 0 1 187.148 513.598 Tm [<004D>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 192.687 513.598 Tm [<0009>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 196.563 513.598 Tm [<0527>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 202.262 513.598 Tm [<000A>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 208.351 513.598 Tm [<0A37>]TJ +ET +EMC +/mi<> BDC +BT +/F23 9.96264 Tf +1 0 0 1 218.315 513.598 Tm [<0062>]TJ +ET +EMC +/mi<> BDC +BT +/F23 9.96264 Tf +1 0 0 1 222.241 513.598 Tm [<0042>]TJ +ET +EMC +/mi<> BDC +BT +/F23 9.96264 Tf +1 0 0 1 225.01 513.598 Tm [<004D>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 230.549 513.598 Tm [<0009>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 234.425 513.598 Tm [<0527>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 242.337 513.598 Tm [<000C>]TJ +ET +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 252.302 513.598 Tm [<0013>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 257.283 513.598 Tm [<117A>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 263.211 513.598 Tm [<000A>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 269.853 513.598 Tm [<001E>]TJ +ET +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 280.371 513.598 Tm [<0011>]TJ +ET +EMC +/Artifact BMC +BT +/F23 9.96264 Tf +1 0 0 1 285.353 513.598 Tm [<0058>]TJ +ET +EMC +/Artifact BMC +BT +/F23 9.96264 Tf +1 0 0 1 303.133 139.255 Tm [<0052>]TJ +ET +EMC +/Artifact BMC +EMC +endstream +endobj +217 0 obj +<< /Type /Page /Contents 218 0 R /Resources 216 0 R /MediaBox [ 0 0 595.276 841.89 ] /StructParents 0/Tabs /S /Parent 223 0 R >> +endobj +216 0 obj +<< /ExtGState 1 0 R /Font << /F28 219 0 R /F23 220 0 R /F29 221 0 R /F40 222 0 R >> >> +endobj +1 0 obj +<< /opacity1 <> >> +endobj +224 0 obj +<< /Marked true >> +endobj +6 0 obj +<< /Nums [0 [ 58 0 R 21 0 R 23 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 69 0 R 70 0 R 72 0 R 39 0 R 46 0 R 47 0 R 49 0 R 51 0 R 88 0 R 89 0 R 92 0 R 94 0 R 95 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 107 0 R 108 0 R 109 0 R 116 0 R 118 0 R 120 0 R 124 0 R 123 0 R 127 0 R 128 0 R 134 0 R 135 0 R 136 0 R 139 0 R 140 0 R 141 0 R 142 0 R 145 0 R 147 0 R 148 0 R 151 0 R 153 0 R 154 0 R 156 0 R 158 0 R 159 0 R 160 0 R 163 0 R 164 0 R 165 0 R 171 0 R 195 0 R 196 0 R 197 0 R 198 0 R 200 0 R 201 0 R 202 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R] +] >> +endobj +7 0 obj +<< >> +endobj +9 0 obj +<< /Type /Namespace /NS (http://iso.org/pdf/ssn) >> +endobj +11 0 obj +<< /Type /Namespace /NS (http://iso.org/pdf2/ssn) >> +endobj +13 0 obj +<< /Type /Namespace /NS (http://www.w3.org/1998/Math/MathML) >> +endobj +15 0 obj +<< /Type /Namespace /NS (data:,A63761E-9D7-4FBB-9B27-C3BC8D9BFB06) >> +endobj +8 0 obj +[ 9 0 R 11 0 R 13 0 R 15 0 R ] +endobj +17 0 obj +<< /Type /StructElem /S /Document /P 5 0 R /K [19 0 R 86 0 R 113 0 R 132 0 R 192 0 R] /NS 11 0 R >> +endobj +19 0 obj +<< /Type /StructElem /S /Formula /P 17 0 R /K [40 0 R 52 0 R 55 0 R] /AF 18 0 R /NS 11 0 R >> +endobj +20 0 obj +<< /Type /StructElem /S /mtd /P 65 0 R /K 21 0 R /NS 13 0 R >> +endobj +21 0 obj +<< /Type /StructElem /S /mn /P 20 0 R /K <> /NS 13 0 R >> +endobj +22 0 obj +<< /Type /StructElem /S /mtd /P 65 0 R /K 23 0 R /NS 13 0 R >> +endobj +23 0 obj +<< /Type /StructElem /S /mn /P 22 0 R /K <> /NS 13 0 R >> +endobj +24 0 obj +<< /Type /StructElem /S /mtd /P 65 0 R /K 25 0 R /NS 13 0 R >> +endobj +25 0 obj +<< /Type /StructElem /S /mn /P 24 0 R /K <> /NS 13 0 R >> +endobj +26 0 obj +<< /Type /StructElem /S /mtd /P 66 0 R /K 27 0 R /NS 13 0 R >> +endobj +27 0 obj +<< /Type /StructElem /S /mn /P 26 0 R /K <> /NS 13 0 R >> +endobj +28 0 obj +<< /Type /StructElem /S /mtd /P 66 0 R /K 29 0 R /NS 13 0 R >> +endobj +29 0 obj +<< /Type /StructElem /S /mn /P 28 0 R /K <> /NS 13 0 R >> +endobj +30 0 obj +<< /Type /StructElem /S /mtd /P 66 0 R /K 31 0 R /NS 13 0 R >> +endobj +31 0 obj +<< /Type /StructElem /S /mn /P 30 0 R /K <> /NS 13 0 R >> +endobj +32 0 obj +<< /Type /StructElem /S /mtd /P 67 0 R /K 33 0 R /NS 13 0 R >> +endobj +33 0 obj +<< /Type /StructElem /S /mn /P 32 0 R /K <> /NS 13 0 R >> +endobj +34 0 obj +<< /Type /StructElem /S /mtd /P 67 0 R /K 35 0 R /NS 13 0 R >> +endobj +35 0 obj +<< /Type /StructElem /S /mn /P 34 0 R /K <> /NS 13 0 R >> +endobj +36 0 obj +<< /Type /StructElem /S /mtd /P 67 0 R /K 37 0 R /NS 13 0 R >> +endobj +37 0 obj +<< /Type /StructElem /S /mn /P 36 0 R /K <> /NS 13 0 R >> +endobj +38 0 obj +<< /Type /StructElem /S /mtd /P 75 0 R /K 39 0 R /NS 13 0 R >> +endobj +39 0 obj +<< /Type /StructElem /S /mn /P 38 0 R /K <> /NS 13 0 R >> +endobj +40 0 obj +<< /Type /StructElem /S /math /P 19 0 R /K [41 0 R 43 0 R] /NS 13 0 R >> +endobj +41 0 obj +<< /Type /StructElem /S /mspace /P 40 0 R /A 42 0 R /NS 13 0 R >> +endobj +43 0 obj +<< /Type /StructElem /S /mi /P 40 0 R /A 44 0 R /NS 13 0 R >> +endobj +45 0 obj +<< /Type /StructElem /S /mtd /P 78 0 R /K [46 0 R 47 0 R 49 0 R] /NS 13 0 R >> +endobj +46 0 obj +<< /Type /StructElem /S /mi /P 45 0 R /K <> /NS 13 0 R >> +endobj +47 0 obj +<< /Type /StructElem /S /mo /P 45 0 R /K <> /A 48 0 R /NS 13 0 R >> +endobj +49 0 obj +<< /Type /StructElem /S /mi /P 45 0 R /K <> /NS 13 0 R >> +endobj +50 0 obj +<< /Type /StructElem /S /mtd /P 79 0 R /K 51 0 R /NS 13 0 R >> +endobj +51 0 obj +<< /Type /StructElem /S /mn /P 50 0 R /K <> /NS 13 0 R >> +endobj +52 0 obj +<< /Type /StructElem /S /math /P 19 0 R /K [53 0 R 54 0 R] /NS 13 0 R >> +endobj +53 0 obj +<< /Type /StructElem /S /mspace /P 52 0 R /A 42 0 R /NS 13 0 R >> +endobj +54 0 obj +<< /Type /StructElem /S /mi /P 52 0 R /A 44 0 R /NS 13 0 R >> +endobj +55 0 obj +<< /Type /StructElem /S /math /P 19 0 R /K [57 0 R 70 0 R 71 0 R] /A 56 0 R /NS 13 0 R >> +endobj +57 0 obj +<< /Type /StructElem /S /mrow /P 55 0 R /K [58 0 R 60 0 R 62 0 R 68 0 R 69 0 R] /NS 13 0 R >> +endobj +58 0 obj +<< /Type /StructElem /S /mo /P 57 0 R /K <> /A 59 0 R /ActualText /NS 13 0 R >> +endobj +60 0 obj +<< /Type /StructElem /S /mspace /P 57 0 R /A 61 0 R /NS 13 0 R >> +endobj +62 0 obj +<< /Type /StructElem /S /mpadded /P 57 0 R /K 64 0 R /A 63 0 R /NS 13 0 R >> +endobj +64 0 obj +<< /Type /StructElem /S /mtable /P 62 0 R /K [65 0 R 66 0 R 67 0 R] /NS 13 0 R >> +endobj +65 0 obj +<< /Type /StructElem /S /mtr /P 64 0 R /K [20 0 R 22 0 R 24 0 R] /NS 13 0 R >> +endobj +66 0 obj +<< /Type /StructElem /S /mtr /P 64 0 R /K [26 0 R 28 0 R 30 0 R] /NS 13 0 R >> +endobj +67 0 obj +<< /Type /StructElem /S /mtr /P 64 0 R /K [32 0 R 34 0 R 36 0 R] /NS 13 0 R >> +endobj +68 0 obj +<< /Type /StructElem /S /mspace /P 57 0 R /A 61 0 R /NS 13 0 R >> +endobj +69 0 obj +<< /Type /StructElem /S /mo /P 57 0 R /K <> /A 59 0 R /ActualText /NS 13 0 R >> +endobj +70 0 obj +<< /Type /StructElem /S /mo /P 55 0 R /K <> /A 48 0 R /NS 13 0 R >> +endobj +71 0 obj +<< /Type /StructElem /S /mrow /P 55 0 R /K [72 0 R 73 0 R 82 0 R] /NS 13 0 R >> +endobj +72 0 obj +<< /Type /StructElem /S /mo /P 71 0 R /K <> /A 59 0 R /ActualText /NS 13 0 R >> +endobj +73 0 obj +<< /Type /StructElem /S /mpadded /P 71 0 R /K 74 0 R /A 63 0 R /NS 13 0 R >> +endobj +74 0 obj +<< /Type /StructElem /S /mtable /P 73 0 R /K [75 0 R 79 0 R] /NS 13 0 R >> +endobj +75 0 obj +<< /Type /StructElem /S /mtr /P 74 0 R /K [38 0 R 76 0 R] /NS 13 0 R >> +endobj +76 0 obj +<< /Type /StructElem /S /mtd /P 75 0 R /K 78 0 R /A 77 0 R /NS 13 0 R >> +endobj +78 0 obj +<< /Type /StructElem /S /mtext /P 76 0 R /K 45 0 R /NS 13 0 R >> +endobj +79 0 obj +<< /Type /StructElem /S /mtr /P 74 0 R /K [50 0 R 80 0 R] /NS 13 0 R >> +endobj +80 0 obj +<< /Type /StructElem /S /mtd /P 79 0 R /K 81 0 R /A 77 0 R /NS 13 0 R >> +endobj +81 0 obj +<< /Type /StructElem /S /mtext /P 80 0 R /NS 13 0 R >> +endobj +82 0 obj +<< /Type /StructElem /S /mspace /P 71 0 R /A 83 0 R /NS 13 0 R >> +endobj +86 0 obj +<< /Type /StructElem /S /Formula /P 17 0 R /K 87 0 R /AF 85 0 R /NS 11 0 R >> +endobj +87 0 obj +<< /Type /StructElem /S /math /P 86 0 R /K [88 0 R 89 0 R 90 0 R 109 0 R] /A 56 0 R /NS 13 0 R >> +endobj +88 0 obj +<< /Type /StructElem /S /mi /P 87 0 R /K <> /NS 13 0 R >> +endobj +89 0 obj +<< /Type /StructElem /S /mo /P 87 0 R /K <> /A 48 0 R /NS 13 0 R >> +endobj +90 0 obj +<< /Type /StructElem /S /mfrac /P 87 0 R /K [91 0 R 106 0 R] /NS 13 0 R >> +endobj +91 0 obj +<< /Type /StructElem /S /mrow /P 90 0 R /K [92 0 R 94 0 R 95 0 R 97 0 R] /NS 13 0 R >> +endobj +92 0 obj +<< /Type /StructElem /S /mo /P 91 0 R /K <> /A 93 0 R /NS 13 0 R >> +endobj +94 0 obj +<< /Type /StructElem /S /mi /P 91 0 R /K <> /NS 13 0 R >> +endobj +95 0 obj +<< /Type /StructElem /S /mo /P 91 0 R /K <> /A 96 0 R /NS 13 0 R >> +endobj +97 0 obj +<< /Type /StructElem /S /msqrt /P 91 0 R /K 98 0 R /NS 13 0 R >> +endobj +98 0 obj +<< /Type /StructElem /S /mrow /P 97 0 R /K [99 0 R 102 0 R 103 0 R 104 0 R 105 0 R] /NS 13 0 R >> +endobj +99 0 obj +<< /Type /StructElem /S /msup /P 98 0 R /K [100 0 R 101 0 R] /NS 13 0 R >> +endobj +100 0 obj +<< /Type /StructElem /S /mi /P 99 0 R /K <> /NS 13 0 R >> +endobj +101 0 obj +<< /Type /StructElem /S /mn /P 99 0 R /K <> /NS 13 0 R >> +endobj +102 0 obj +<< /Type /StructElem /S /mo /P 98 0 R /K <> /A 96 0 R /NS 13 0 R >> +endobj +103 0 obj +<< /Type /StructElem /S /mn /P 98 0 R /K <> /NS 13 0 R >> +endobj +104 0 obj +<< /Type /StructElem /S /mi /P 98 0 R /K <> /NS 13 0 R >> +endobj +105 0 obj +<< /Type /StructElem /S /mi /P 98 0 R /K <> /NS 13 0 R >> +endobj +106 0 obj +<< /Type /StructElem /S /mrow /P 90 0 R /K [107 0 R 108 0 R] /NS 13 0 R >> +endobj +107 0 obj +<< /Type /StructElem /S /mn /P 106 0 R /K <> /NS 13 0 R >> +endobj +108 0 obj +<< /Type /StructElem /S /mi /P 106 0 R /K <> /NS 13 0 R >> +endobj +109 0 obj +<< /Type /StructElem /S /mo /P 87 0 R /K <> /A 110 0 R /NS 13 0 R >> +endobj +113 0 obj +<< /Type /StructElem /S /Formula /P 17 0 R /K 114 0 R /AF 112 0 R /NS 11 0 R >> +endobj +114 0 obj +<< /Type /StructElem /S /math /P 113 0 R /K [115 0 R 119 0 R 122 0 R 126 0 R] /A 56 0 R /NS 13 0 R >> +endobj +115 0 obj +<< /Type /StructElem /S /munder /P 114 0 R /K [116 0 R 118 0 R] /NS 13 0 R >> +endobj +116 0 obj +<< /Type /StructElem /S /mo /P 115 0 R /K <> /A 117 0 R /NS 13 0 R >> +endobj +118 0 obj +<< /Type /StructElem /S /mi /P 115 0 R /K <> /NS 13 0 R >> +endobj +119 0 obj +<< /Type /StructElem /S /munder /P 114 0 R /K [120 0 R 121 0 R] /NS 13 0 R >> +endobj +120 0 obj +<< /Type /StructElem /S /mi /P 119 0 R /K <> /NS 13 0 R >> +endobj +121 0 obj +<< /Type /StructElem /S /mo /P 119 0 R /NS 13 0 R >> +endobj +122 0 obj +<< /Type /StructElem /S /mover /P 114 0 R /K [123 0 R 124 0 R] /NS 13 0 R >> +endobj +123 0 obj +<< /Type /StructElem /S /mi /P 122 0 R /K <> /NS 13 0 R >> +endobj +124 0 obj +<< /Type /StructElem /S /mo /P 122 0 R /K <> /A 125 0 R /ActualText /NS 13 0 R >> +endobj +126 0 obj +<< /Type /StructElem /S /msup /P 114 0 R /K [127 0 R 128 0 R] /NS 13 0 R >> +endobj +127 0 obj +<< /Type /StructElem /S /mi /P 126 0 R /K <> /NS 13 0 R >> +endobj +128 0 obj +<< /Type /StructElem /S /mi /P 126 0 R /K <> /A 129 0 R /NS 13 0 R >> +endobj +132 0 obj +<< /Type /StructElem /S /Formula /P 17 0 R /K 178 0 R /AF 131 0 R /NS 11 0 R >> +endobj +133 0 obj +<< /Type /StructElem /S /mtd /P 181 0 R /K [134 0 R 135 0 R 136 0 R] /NS 13 0 R >> +endobj +134 0 obj +<< /Type /StructElem /S /mi /P 133 0 R /K <> /NS 13 0 R >> +endobj +135 0 obj +<< /Type /StructElem /S /mi /P 133 0 R /K <> /NS 13 0 R >> +endobj +136 0 obj +<< /Type /StructElem /S /mi /P 133 0 R /K <> /NS 13 0 R >> +endobj +137 0 obj +<< /Type /StructElem /S /mtd /P 181 0 R /K [138 0 R 139 0 R 140 0 R 141 0 R 142 0 R] /NS 13 0 R >> +endobj +138 0 obj +<< /Type /StructElem /S /mi /P 137 0 R /A 44 0 R /NS 13 0 R >> +endobj +139 0 obj +<< /Type /StructElem /S /mo /P 137 0 R /K <> /A 48 0 R /NS 13 0 R >> +endobj +140 0 obj +<< /Type /StructElem /S /mi /P 137 0 R /K <> /NS 13 0 R >> +endobj +141 0 obj +<< /Type /StructElem /S /mi /P 137 0 R /K <> /NS 13 0 R >> +endobj +142 0 obj +<< /Type /StructElem /S /mi /P 137 0 R /K <> /NS 13 0 R >> +endobj +143 0 obj +<< /Type /StructElem /S /mtd /P 181 0 R /K 144 0 R /NS 13 0 R >> +endobj +144 0 obj +<< /Type /StructElem /S /msup /P 143 0 R /K [145 0 R 146 0 R] /NS 13 0 R >> +endobj +145 0 obj +<< /Type /StructElem /S /mi /P 144 0 R /K <> /NS 13 0 R >> +endobj +146 0 obj +<< /Type /StructElem /S /mrow /P 144 0 R /K [147 0 R 148 0 R] /NS 13 0 R >> +endobj +147 0 obj +<< /Type /StructElem /S /mi /P 146 0 R /K <> /A 129 0 R /NS 13 0 R >> +endobj +148 0 obj +<< /Type /StructElem /S /mi /P 146 0 R /K <> /NS 13 0 R >> +endobj +149 0 obj +<< /Type /StructElem /S /mtd /P 181 0 R /K [150 0 R 151 0 R 153 0 R 154 0 R] /NS 13 0 R >> +endobj +150 0 obj +<< /Type /StructElem /S /mi /P 149 0 R /A 44 0 R /NS 13 0 R >> +endobj +151 0 obj +<< /Type /StructElem /S /mo /P 149 0 R /K <> /A 152 0 R /NS 13 0 R >> +endobj +153 0 obj +<< /Type /StructElem /S /mo /P 149 0 R /K <> /A 152 0 R /NS 13 0 R >> +endobj +154 0 obj +<< /Type /StructElem /S /mn /P 149 0 R /K <> /NS 13 0 R >> +endobj +155 0 obj +<< /Type /StructElem /S /mtd /P 184 0 R /K [156 0 R 158 0 R 159 0 R 160 0 R] /NS 13 0 R >> +endobj +156 0 obj +<< /Type /StructElem /S /mo /P 155 0 R /K <> /A 157 0 R /ActualText /NS 13 0 R >> +endobj +158 0 obj +<< /Type /StructElem /S /mn /P 155 0 R /K <> /NS 13 0 R >> +endobj +159 0 obj +<< /Type /StructElem /S /mo /P 155 0 R /K <> /A 96 0 R /NS 13 0 R >> +endobj +160 0 obj +<< /Type /StructElem /S /mn /P 155 0 R /K <> /NS 13 0 R >> +endobj +161 0 obj +<< /Type /StructElem /S /mtd /P 184 0 R /K [162 0 R 163 0 R 164 0 R 165 0 R] /NS 13 0 R >> +endobj +162 0 obj +<< /Type /StructElem /S /mi /P 161 0 R /A 44 0 R /NS 13 0 R >> +endobj +163 0 obj +<< /Type /StructElem /S /mo /P 161 0 R /K <> /A 48 0 R /NS 13 0 R >> +endobj +164 0 obj +<< /Type /StructElem /S /mn /P 161 0 R /K <> /NS 13 0 R >> +endobj +165 0 obj +<< /Type /StructElem /S /mo /P 161 0 R /K <> /A 157 0 R /ActualText /NS 13 0 R >> +endobj +166 0 obj +<< /Type /StructElem /S /mtd /P 184 0 R /K 167 0 R /NS 13 0 R >> +endobj +167 0 obj +<< /Type /StructElem /S /mi /P 166 0 R /A 44 0 R /NS 13 0 R >> +endobj +168 0 obj +<< /Type /StructElem /S /mtd /P 184 0 R /K 169 0 R /NS 13 0 R >> +endobj +169 0 obj +<< /Type /StructElem /S /mi /P 168 0 R /A 44 0 R /NS 13 0 R >> +endobj +170 0 obj +<< /Type /StructElem /S /mtd /P 187 0 R /K 171 0 R /NS 13 0 R >> +endobj +171 0 obj +<< /Type /StructElem /S /mn /P 170 0 R /K <> /NS 13 0 R >> +endobj +172 0 obj +<< /Type /StructElem /S /mtd /P 187 0 R /K 173 0 R /NS 13 0 R >> +endobj +173 0 obj +<< /Type /StructElem /S /mi /P 172 0 R /A 44 0 R /NS 13 0 R >> +endobj +174 0 obj +<< /Type /StructElem /S /mtd /P 187 0 R /K 175 0 R /NS 13 0 R >> +endobj +175 0 obj +<< /Type /StructElem /S /mi /P 174 0 R /A 44 0 R /NS 13 0 R >> +endobj +176 0 obj +<< /Type /StructElem /S /mtd /P 187 0 R /K 177 0 R /NS 13 0 R >> +endobj +177 0 obj +<< /Type /StructElem /S /mi /P 176 0 R /A 44 0 R /NS 13 0 R >> +endobj +178 0 obj +<< /Type /StructElem /S /math /P 132 0 R /K 179 0 R /A 56 0 R /NS 13 0 R >> +endobj +179 0 obj +<< /Type /StructElem /S /mtable /P 178 0 R /K [181 0 R 184 0 R 187 0 R] /A 180 0 R /NS 13 0 R >> +endobj +181 0 obj +<< /Type /StructElem /S /mlabeledtr /P 179 0 R /K [182 0 R 133 0 R 137 0 R 143 0 R 149 0 R] /NS 13 0 R >> +endobj +182 0 obj +<< /Type /StructElem /S /mtd /P 181 0 R /K 183 0 R /NS 13 0 R >> +endobj +183 0 obj +<< /Type /StructElem /S /mtext /P 182 0 R /NS 13 0 R >> +endobj +184 0 obj +<< /Type /StructElem /S /mlabeledtr /P 179 0 R /K [185 0 R 155 0 R 161 0 R 166 0 R 168 0 R] /NS 13 0 R >> +endobj +185 0 obj +<< /Type /StructElem /S /mtd /P 184 0 R /K 186 0 R /NS 13 0 R >> +endobj +186 0 obj +<< /Type /StructElem /S /mtext /P 185 0 R /NS 13 0 R >> +endobj +187 0 obj +<< /Type /StructElem /S /mlabeledtr /P 179 0 R /K [188 0 R 170 0 R 172 0 R 174 0 R 176 0 R] /NS 13 0 R >> +endobj +188 0 obj +<< /Type /StructElem /S /mtd /P 187 0 R /K 189 0 R /NS 13 0 R >> +endobj +189 0 obj +<< /Type /StructElem /S /mtext /P 188 0 R /NS 13 0 R >> +endobj +192 0 obj +<< /Type /StructElem /S /Formula /P 17 0 R /K 193 0 R /AF 191 0 R /NS 11 0 R >> +endobj +193 0 obj +<< /Type /StructElem /S /math /P 192 0 R /K [194 0 R 198 0 R 200 0 R 201 0 R 202 0 R 203 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R] /NS 13 0 R >> +endobj +194 0 obj +<< /Type /StructElem /S /mrow /P 193 0 R /K [195 0 R 196 0 R 197 0 R] /NS 13 0 R >> +endobj +195 0 obj +<< /Type /StructElem /S /mi /P 194 0 R /K <> /A 129 0 R /NS 13 0 R >> +endobj +196 0 obj +<< /Type /StructElem /S /mi /P 194 0 R /K <> /A 129 0 R /NS 13 0 R >> +endobj +197 0 obj +<< /Type /StructElem /S /mi /P 194 0 R /K <> /A 129 0 R /NS 13 0 R >> +endobj +198 0 obj +<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 199 0 R /NS 13 0 R >> +endobj +200 0 obj +<< /Type /StructElem /S /mi /P 193 0 R /K <> /NS 13 0 R >> +endobj +201 0 obj +<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 199 0 R /NS 13 0 R >> +endobj +202 0 obj +<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 96 0 R /NS 13 0 R >> +endobj +203 0 obj +<< /Type /StructElem /S /mrow /P 193 0 R /K [204 0 R 205 0 R 206 0 R] /NS 13 0 R >> +endobj +204 0 obj +<< /Type /StructElem /S /mi /P 203 0 R /K <> /A 129 0 R /NS 13 0 R >> +endobj +205 0 obj +<< /Type /StructElem /S /mi /P 203 0 R /K <> /A 129 0 R /NS 13 0 R >> +endobj +206 0 obj +<< /Type /StructElem /S /mi /P 203 0 R /K <> /A 129 0 R /NS 13 0 R >> +endobj +207 0 obj +<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 199 0 R /NS 13 0 R >> +endobj +208 0 obj +<< /Type /StructElem /S /mi /P 193 0 R /K <> /NS 13 0 R >> +endobj +209 0 obj +<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 96 0 R /NS 13 0 R >> +endobj +210 0 obj +<< /Type /StructElem /S /mn /P 193 0 R /K <> /NS 13 0 R >> +endobj +211 0 obj +<< /Type /StructElem /S /mi /P 193 0 R /K <> /NS 13 0 R >> +endobj +212 0 obj +<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 199 0 R /NS 13 0 R >> +endobj +213 0 obj +<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 48 0 R /NS 13 0 R >> +endobj +214 0 obj +<< /Type /StructElem /S /mn /P 193 0 R /K <> /NS 13 0 R >> +endobj +5 0 obj +<< /Type /StructTreeRoot /K 17 0 R /ParentTree 6 0 R /RoleMap 7 0 R /Namespaces 8 0 R >> +endobj +225 0 obj +[ 66 [ 323 ] ] +endobj +227 0 obj +<< /Subtype /CIDFontType0C /Length 592 >> +[BINARY STREAM] +endobj +226 0 obj +<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 227 0 R >> +endobj +228 0 obj +<< /Length 687 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-QTQISS-LMRoman7-Regular-0) +%%Title: (TeX-QTQISS-LMRoman7-Regular-0 TeX QTQISS-LMRoman7-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (QTQISS-LMRoman7-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-QTQISS-LMRoman7-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +1 beginbfchar +<0042> <0069> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj +222 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 229 0 R ] /ToUnicode 228 0 R >> +endobj +229 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 226 0 R /W 225 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +230 0 obj +[ 1013 [ 569 ] 1404 [ 620 ] 2981 [ 407 ] 4558 [ 668 ] ] +endobj +232 0 obj +<< /Subtype /CIDFontType0C /Length 1102 >> +[BINARY STREAM] +endobj +231 0 obj +<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 232 0 R >> +endobj +233 0 obj +<< /Length 772 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-ZIIHRW-LatinModernMath-Regular-0) +%%Title: (TeX-ZIIHRW-LatinModernMath-Regular-0 TeX ZIIHRW-LatinModernMath-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (ZIIHRW-LatinModernMath-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-ZIIHRW-LatinModernMath-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +4 beginbfchar +<03F5> <0032> +<057C> +<0BA5> <2032> +<11CE> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj +221 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 234 0 R ] /ToUnicode 233 0 R >> +endobj +234 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 231 0 R /W 230 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +235 0 obj +[ 49 [ 681 444 ] 55 [ 306 ] 59 [ 500 ] 66 [ 278 ] 72 [ 278 ] 77 [ 556 ] 82 [ 500 ] 85 [ 389 389 ] 88 [ 278 ] 98 [ 394 ] 103 [ 333 ] 105 [ 389 500 500 ] ] +endobj +237 0 obj +<< /Subtype /CIDFontType0C /Length 2185 >> +[BINARY STREAM] +endobj +236 0 obj +<< /Type /FontDescriptor /FontName /JBZCCA+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 237 0 R >> +endobj +238 0 obj +<< /Length 903 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-JBZCCA-LMRoman10-Regular-0) +%%Title: (TeX-JBZCCA-LMRoman10-Regular-0 TeX JBZCCA-LMRoman10-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (JBZCCA-LMRoman10-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-JBZCCA-LMRoman10-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +16 beginbfchar +<0031> <0045> +<0032> <0065> +<0037> <0066> +<003B> <0067> +<0042> <0069> +<0048> <006C> +<004D> <006E> +<0052> <0031> +<0055> <0028> +<0056> <0029> +<0058> <002E> +<0062> <0073> +<0067> <0020> +<0069> <0074> +<006A> <0033> +<006B> <0032> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj +220 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /JBZCCA+LMRoman10-Regular /DescendantFonts [ 239 0 R ] /ToUnicode 238 0 R >> +endobj +239 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /JBZCCA+LMRoman10-Regular /FontDescriptor 236 0 R /W 235 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +240 0 obj +[ 9 [ 389 389 ] 12 [ 778 ] 15 [ 278 ] 17 [ 500 500 500 500 500 500 ] 30 [ 778 ] 1296 [ 529 429 433 520 466 490 ] 1319 [ 572 ] 1790 [ 0 ] 2455 [ 663 663 ] 2503 [ 875 875 875 875 875 875 ] 2515 [ 902 ] 2615 [ 778 ] 2619 [ 778 ] 3074 [ 1444 ] 3077 [ 833 ] 4474 [ 570 ] ] +endobj +242 0 obj +<< /Subtype /CIDFontType0C /Length 4088 >> +[BINARY STREAM] +endobj +241 0 obj +<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 242 0 R >> +endobj +243 0 obj +<< /Length 1203 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-RHJXIX-LatinModernMath-Regular-0) +%%Title: (TeX-RHJXIX-LatinModernMath-Regular-0 TeX RHJXIX-LatinModernMath-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (RHJXIX-LatinModernMath-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-RHJXIX-LatinModernMath-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +33 beginbfchar +<0009> <0028> +<000A> <0029> +<000C> <002B> +<000F> <002E> +<0011> <0030> +<0012> <0031> +<0013> <0032> +<0014> <0033> +<0015> <0034> +<0016> <0035> +<001E> <003D> +<0510> +<0511> +<0512> +<0513> +<0514> +<0515> +<0527> +<06FE> <0307> +<0997> <0028> +<0998> <0029> +<09C7> <239D> +<09C8> <239C> +<09C9> <239B> +<09CA> <23A0> +<09CB> <239F> +<09CC> <239E> +<09D3> <007B> +<0A37> <2212> +<0A3B> <00B1> +<0C02> <2211> +<0C05> <221A> +<117A> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj +219 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 244 0 R ] /ToUnicode 243 0 R >> +endobj +244 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 241 0 R /W 240 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +223 0 obj +<< /Type /Pages /Count 1 /Kids [ 217 0 R ] >> +endobj +245 0 obj +<< /Type /Catalog /Pages 223 0 R /MarkInfo 224 0 R/Lang (en-US)/StructTreeRoot 5 0 R >> +endobj +246 0 obj +<< /Producer (LuaTeX-1.13.2) /Creator (TeX) /CreationDate (D:20160520110000+02'00') /ModDate (D:20160520110000+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.13.2 (TeX Live 2021)) >> +endobj +xref +0 247 +0000000002 65535 f +0000015555 00000 n +0000000003 00000 f +0000000004 00000 f +0000000010 00000 f +0000034484 00000 n +0000015639 00000 n +0000016276 00000 n +0000016604 00000 n +0000016298 00000 n +0000000012 00000 f +0000016366 00000 n +0000000014 00000 f +0000016436 00000 n +0000000016 00000 f +0000016517 00000 n +0000000000 00000 f +0000016651 00000 n +0000001840 00000 n +0000016769 00000 n +0000016881 00000 n +0000016962 00000 n +0000017071 00000 n +0000017152 00000 n +0000017261 00000 n +0000017342 00000 n +0000017451 00000 n +0000017532 00000 n +0000017641 00000 n +0000017722 00000 n +0000017831 00000 n +0000017912 00000 n +0000018021 00000 n +0000018102 00000 n +0000018211 00000 n +0000018292 00000 n +0000018401 00000 n +0000018482 00000 n +0000018591 00000 n +0000018672 00000 n +0000018782 00000 n +0000018873 00000 n +0000000020 00000 n +0000018958 00000 n +0000000074 00000 n +0000019039 00000 n +0000019136 00000 n +0000019246 00000 n +0000000129 00000 n +0000019367 00000 n +0000019477 00000 n +0000019558 00000 n +0000019668 00000 n +0000019759 00000 n +0000019844 00000 n +0000019925 00000 n +0000000200 00000 n +0000020034 00000 n +0000020146 00000 n +0000000254 00000 n +0000020289 00000 n +0000000341 00000 n +0000020374 00000 n +0000000396 00000 n +0000020470 00000 n +0000020570 00000 n +0000020667 00000 n +0000020764 00000 n +0000020861 00000 n +0000020946 00000 n +0000021090 00000 n +0000021211 00000 n +0000021309 00000 n +0000021453 00000 n +0000021549 00000 n +0000021642 00000 n +0000021732 00000 n +0000000468 00000 n +0000021824 00000 n +0000021907 00000 n +0000021997 00000 n +0000022089 00000 n +0000022162 00000 n +0000000525 00000 n +0000000579 00000 n +0000002907 00000 n +0000022247 00000 n +0000022343 00000 n +0000022460 00000 n +0000022570 00000 n +0000022691 00000 n +0000022784 00000 n +0000022889 00000 n +0000002018 00000 n +0000023010 00000 n +0000023120 00000 n +0000002083 00000 n +0000023241 00000 n +0000023324 00000 n +0000023440 00000 n +0000023533 00000 n +0000023644 00000 n +0000023755 00000 n +0000023877 00000 n +0000023988 00000 n +0000024099 00000 n +0000024210 00000 n +0000024304 00000 n +0000024416 00000 n +0000024528 00000 n +0000002154 00000 n +0000002214 00000 n +0000003776 00000 n +0000024651 00000 n +0000024750 00000 n +0000024872 00000 n +0000024969 00000 n +0000003087 00000 n +0000025093 00000 n +0000025205 00000 n +0000025302 00000 n +0000025414 00000 n +0000025486 00000 n +0000025582 00000 n +0000025694 00000 n +0000003173 00000 n +0000025841 00000 n +0000025936 00000 n +0000026048 00000 n +0000003228 00000 n +0000003288 00000 n +0000005765 00000 n +0000026172 00000 n +0000026271 00000 n +0000026373 00000 n +0000026485 00000 n +0000026597 00000 n +0000026709 00000 n +0000026827 00000 n +0000026910 00000 n +0000027033 00000 n +0000027145 00000 n +0000027257 00000 n +0000027369 00000 n +0000027453 00000 n +0000027548 00000 n +0000027660 00000 n +0000027755 00000 n +0000027879 00000 n +0000027991 00000 n +0000028101 00000 n +0000028184 00000 n +0000003957 00000 n +0000028308 00000 n +0000028432 00000 n +0000028544 00000 n +0000028654 00000 n +0000004023 00000 n +0000028801 00000 n +0000028913 00000 n +0000029036 00000 n +0000029148 00000 n +0000029258 00000 n +0000029341 00000 n +0000029464 00000 n +0000029576 00000 n +0000029723 00000 n +0000029807 00000 n +0000029890 00000 n +0000029974 00000 n +0000030057 00000 n +0000030141 00000 n +0000030253 00000 n +0000030337 00000 n +0000030420 00000 n +0000030504 00000 n +0000030587 00000 n +0000030671 00000 n +0000030754 00000 n +0000030850 00000 n +0000004147 00000 n +0000030967 00000 n +0000031092 00000 n +0000031176 00000 n +0000031251 00000 n +0000031376 00000 n +0000031460 00000 n +0000031535 00000 n +0000031660 00000 n +0000031744 00000 n +0000004265 00000 n +0000007077 00000 n +0000031819 00000 n +0000031918 00000 n +0000032109 00000 n +0000032212 00000 n +0000032336 00000 n +0000032460 00000 n +0000032584 00000 n +0000005946 00000 n +0000032708 00000 n +0000032820 00000 n +0000032944 00000 n +0000033067 00000 n +0000033170 00000 n +0000033294 00000 n +0000033418 00000 n +0000033542 00000 n +0000033666 00000 n +0000033778 00000 n +0000033901 00000 n +0000034013 00000 n +0000034125 00000 n +0000034249 00000 n +0000034372 00000 n +0000006022 00000 n +0000015451 00000 n +0000015305 00000 n +0000007258 00000 n +0000049263 00000 n +0000042951 00000 n +0000038951 00000 n +0000036269 00000 n +0000049635 00000 n +0000015602 00000 n +0000034589 00000 n +0000035298 00000 n +0000034621 00000 n +0000035521 00000 n +0000036425 00000 n +0000036627 00000 n +0000037887 00000 n +0000036700 00000 n +0000038118 00000 n +0000039114 00000 n +0000039323 00000 n +0000041764 00000 n +0000039494 00000 n +0000041987 00000 n +0000043108 00000 n +0000043311 00000 n +0000047769 00000 n +0000043596 00000 n +0000047999 00000 n +0000049426 00000 n +0000049699 00000 n +0000049804 00000 n +trailer +<< /Size 247 /Root 245 0 R /Info 246 0 R /ID [ <4F23DD47C2CB1E4A823FC7CBBBCDBD14> <4F23DD47C2CB1E4A823FC7CBBBCDBD14> ] >> +startxref +50027 +%%EOF diff --git a/testfiles-lua/test_xml.mlr b/testfiles-lua/test_xml.mlr new file mode 100644 index 0000000..00e5ff8 --- /dev/null +++ b/testfiles-lua/test_xml.mlr @@ -0,0 +1,229 @@ + + + + + + + + + + + ( + + + + + + 1 + + + 0 + + + 0 + + + + + 0 + + + 1 + + + 0 + + + + + 0 + + + 0 + + + 1 + + + + + + ) + + = + + { + + + + + 1 + + + if  + + ๐‘Ž + = + ๐‘ + + + + + + 2 + + + else + + + + + + + + + ๐‘ฅ + = + + + โˆ’ + ๐‘ + ยฑ + + + + ๐‘ + 2 + + โˆ’ + 4 + ๐‘Ž + ๐‘ + + + + + 2 + ๐‘Ž + + + . + + + + โˆ‘ + ๐‘Ž + + + ๐‘ + _ + + + ๐‘ + . + + + ๐‘ + โ€ฒ + + + + + + + (1) + + + ๐‘Ž + ๐‘ + ๐‘ + + + + = + ๐‘‘ + ๐‘’ + ๐‘“ + + + + ๐‘’ + + i + ๐œ‹ + + + + + + = + โˆ’ + 1 + + + + + (2) + + + ( + 1 + + + 2 + + + + = + 3 + ) + + + + + + + + + + + (3) + + + 5 + + + + + + + + + + + + + + + + s + i + n + + ( + ๐‘ฅ + ) + โˆ’ + + s + i + n + + ( + ๐‘ฅ + + + 2 + ๐œ‹ + ) + = + 0 + diff --git a/testfiles-lua/test_xml.mlt b/testfiles-lua/test_xml.mlt new file mode 100644 index 0000000..a732ade --- /dev/null +++ b/testfiles-lua/test_xml.mlt @@ -0,0 +1,53 @@ +\RequirePackage{pdfmanagement-testphase} +\DeclareDocumentMetadata{ + uncompress, + pdfversion = 2.0, +} +\documentclass{article} +\usepackage[l3build]{luamml-demo} +\usepackage{tagpdf} +\tagpdfsetup{ + activate-all, + interwordspace=true, +} + +\usepackage{unicode-math} + +\begin{document} +\tagstructbegin{tag=Document} +\LuaMMLTagAF{} { +\[ + \begin{pmatrix} + 1 & 0 & 0 \\ + 0 & 1 & 0 \\ + 0 & 0 & 1 + \end{pmatrix} + = + \begin{cases} + 1 & $if $a=b\\ + 2 & $else$ + \end{cases} +\] +} +\LuaMMLTagAF{} { +\[ + x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}. +\] +} +\LuaMMLTagAF{} { +\[ + \sum_a\underline c\dot bc' +\] +} + +\LuaMMLTagAF{} { +\begin{align} + abc&=def & e^{\mathrm{i}\pi}&=-1\\ + \Big(1+2&=3\Big)\\ + 5 +\end{align} +} + +Es gilt \LuaMMLTagAF{}{$\sin(x)-\sin(x+2\pi)=0$}. +\tagstructend +\end{document} From f132e3496a3edd4bcd90f96628d36fb46b9bc632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 1 Nov 2021 06:47:55 +0100 Subject: [PATCH 084/206] Patch \text --- luamml-patches-amstext.sty | 37 +++++++++++++++++++++++++++++++++++ luamml-tex-annotate.lua | 16 ++++++++++++++- luamml.dtx | 1 + testfiles-lua/test_struct.pvt | 11 +++++++++-- 4 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 luamml-patches-amstext.sty diff --git a/luamml-patches-amstext.sty b/luamml-patches-amstext.sty new file mode 100644 index 0000000..d4d15ca --- /dev/null +++ b/luamml-patches-amstext.sty @@ -0,0 +1,37 @@ +\ProvidesExplPackage {luamml-patches-amstext} {2021-04-23} {0.0.1-alpha} + {Feel free to add a description here} + +\int_new:N \g__luamml_amsmath_text_struct_int +\cs_set:Npn \textdef@ #1 #2 #3 { + \int_if_odd:nTF { \int_div_truncate:nn { \l__luamml_flag_int } { 8 } } { + \int_gincr:N \g__luamml_amsmath_text_struct_int + \tag_struct_begin:n { + tag = mtext/mathml, + stash, + label = __luamml_amsmath_text_ \int_use:N \g__luamml_amsmath_text_struct_int + } + \tag_mc_begin:n { + tag = mtext + } + \AnnotateFormula { + nucleus = true, + struct = "__luamml_amsmath_text_ \int_use:N \g__luamml_amsmath_text_struct_int" + } + } { + \use_i:n + } + { + \hbox { + { + \everymath {#1} + \let \f@size #2 + \selectfont + #3 + } + } + } + \int_if_odd:nT { \int_div_truncate:nn { \l__luamml_flag_int } { 8 } } { + \tag_mc_end: + \tag_struct_end: + } +} diff --git a/luamml-tex-annotate.lua b/luamml-tex-annotate.lua index 0f852ad..4b22374 100644 --- a/luamml-tex-annotate.lua +++ b/luamml-tex-annotate.lua @@ -59,7 +59,21 @@ local function annotate() props = {} properties[marked] = props end - props.mathml_core = annotation.core + if annotation.core then + props.mathml_core = annotation.core + end + if annotation.struct then + local saved = props.mathml_filter + local struct = annotation.struct + function props.mathml_filter(mml, core) + mml[':struct'] = struct + if saved then + return saved(mml, core) + else + return mml, core + end + end + end else tex.error'Unable to annotate nucleus of node without nucleus' end diff --git a/luamml.dtx b/luamml.dtx index 4d6f84e..72b9561 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -450,6 +450,7 @@ % \begin{macrocode} \RequirePackage { luamml-patches-kernel } %<*luatex> +\__luamml_patch_package:n {amstext} \__luamml_patch_package:n {amsmath} \__luamml_patch_package:n {array} % diff --git a/testfiles-lua/test_struct.pvt b/testfiles-lua/test_struct.pvt index bfc1ae0..2abba81 100644 --- a/testfiles-lua/test_struct.pvt +++ b/testfiles-lua/test_struct.pvt @@ -18,6 +18,13 @@ \begin{document} \tagstructbegin{tag=Document} + +\tagstructbegin{tag=P} +\tagmcbegin{tag=P} +hello +\tagmcend +\tagstructend + \LuaMMLTagAF{} { \[ \begin{pmatrix} @@ -27,8 +34,8 @@ \end{pmatrix} = \begin{cases} - 1 & $if $a=b\\ - 2 & $else$ + 1 & \text{if $a=b$} \\ + 2 & \text{else} \end{cases} \] } From 0cd0784699f9837aa7c520e13f8b789bf7126624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 1 Nov 2021 06:48:32 +0100 Subject: [PATCH 085/206] Patch {cases} --- luamml-patches-amsmath.sty | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index f8933c4..fa6ec7e 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -406,3 +406,10 @@ } } } + +\cs_set:Npn \env@cases { + \let \@ifnextchar \new@ifnextchar + \left \lbrace + \def \arraystretch {1.2} + \array {@{}l@{\quad \luamml_flag_ignore:}l@{}} +} From 288af485979f07cdeaeb4493ccdcf0b0a92480b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 1 Nov 2021 06:52:39 +0100 Subject: [PATCH 086/206] Update testfiles --- testfiles-lua/test_struct.tpf | 1794 +++++++++++++++++---------------- testfiles-lua/test_xml.mlr | 8 - 2 files changed, 934 insertions(+), 868 deletions(-) diff --git a/testfiles-lua/test_struct.tpf b/testfiles-lua/test_struct.tpf index c772311..6da1844 100644 --- a/testfiles-lua/test_struct.tpf +++ b/testfiles-lua/test_struct.tpf @@ -1,132 +1,127 @@ %PDF-2.0 %ฬีมิลุะฤฦ -42 0 obj -<< /O/NSO/NS 13 0 R/width(9.963pt) >> -endobj 44 0 obj -<< /O/NSO/NS 13 0 R/intent(@ignore) >> +<< /O/NSO/NS 13 0 R/displaystyle(true)/scriptlevel(0) >> endobj -48 0 obj +47 0 obj << /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0.278em) >> endobj -56 0 obj +66 0 obj +<< /O/NSO/NS 13 0 R/intent(@ignore) >> +endobj +76 0 obj << /O/NSO/NS 13 0 R/display(block) >> endobj -59 0 obj +79 0 obj << /O/NSO/NS 13 0 R/fence(true)/lspace(0)/rspace(0)/symmetric(true) >> endobj -61 0 obj +81 0 obj << /O/NSO/NS 13 0 R/width(-4.981pt) >> endobj -63 0 obj +83 0 obj << /O/NSO/NS 13 0 R/lspace(+4.981pt)/width(+9.963pt) >> endobj -77 0 obj -<< /O/NSO/NS 13 0 R/columnalign(left) >> -endobj -83 0 obj +98 0 obj << /O/NSO/NS 13 0 R/width(1.196pt) >> endobj -84 0 obj +99 0 obj <> + /Length 1305 >> stream -(100010001)={1ifย ๐‘Ž=๐‘2else +(100010001)={1ifย ๐‘Ž=๐‘2else endstream endobj -18 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +19 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -93 0 obj +108 0 obj << /O/NSO/NS 13 0 R/lspace(0)/rspace(0.222em) >> endobj -96 0 obj +111 0 obj << /O/NSO/NS 13 0 R/lspace(0.222em)/rspace(0.222em) >> endobj -110 0 obj +125 0 obj << /O/NSO/NS 13 0 R/lspace(0)/rspace(0) >> endobj -111 0 obj +126 0 obj <> stream ๐‘ฅ=โˆ’๐‘ยฑ๐‘2โˆ’4๐‘Ž๐‘2๐‘Ž. endstream endobj -85 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +100 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -117 0 obj +132 0 obj << /O/NSO/NS 13 0 R/lspace(0)/movablelimits(true)/rspace(0.167em) >> endobj -125 0 obj +140 0 obj << /O/NSO/NS 13 0 R/stretchy(true) >> endobj -129 0 obj +144 0 obj << /O/NSO/NS 13 0 R/mathvariant(normal) >> endobj -130 0 obj +145 0 obj <> stream โˆ‘๐‘Ž๐‘_๐‘.๐‘โ€ฒ endstream endobj -112 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +127 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -152 0 obj +167 0 obj << /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0) >> endobj -157 0 obj +172 0 obj << /O/NSO/NS 13 0 R/fence(true)/lspace(0)/maxsize(17.861pt)/minsize(17.861pt)/rspace(0)/symmetric(true) >> endobj -180 0 obj +195 0 obj << /O/NSO/NS 13 0 R/columnalign(right left right left)/columnspacing(0 .8em 0)/displaystyle(true) >> endobj -190 0 obj +205 0 obj <> stream (1)๐‘Ž๐‘๐‘=๐‘‘๐‘’๐‘“๐‘’i๐œ‹=โˆ’1(2)(1+2=3)(3)5 endstream endobj -131 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +146 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -199 0 obj +214 0 obj << /O/NSO/NS 13 0 R/lspace(0)/rspace(0)/stretchy(false) >> endobj -215 0 obj +230 0 obj <> stream sin(๐‘ฅ)โˆ’sin(๐‘ฅ+2๐œ‹)=0 endstream endobj -191 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +206 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -218 0 obj -<< /Length 7986 >> +233 0 obj +<< /Length 8172 >> stream /opacity1 gs /Artifact BMC EMC -/mo<> BDC +/P<> BDC BT -/F28 9.96264 Tf -1 0 0 1 244.284 689.457 Tm [<09C9>]TJ -1 0 0 1 244.284 685.715 Tm [<09C8>]TJ -1 0 0 1 244.284 672.041 Tm [<09C7>]TJ +/F23 9.96264 Tf +1 0 0 1 148.712 707.125 Tm [<003F0032004800480051>]TJ ET EMC -/Artifact BMC -EMC -/mn<> BDC +/mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 253.001 697.76 Tm [<0012>]TJ +1 0 0 1 244.284 677.502 Tm [<09C9>]TJ +1 0 0 1 244.284 673.76 Tm [<09C8>]TJ +1 0 0 1 244.284 660.086 Tm [<09C7>]TJ ET EMC /Artifact BMC @@ -134,7 +129,7 @@ EMC /mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 267.945 697.76 Tm [<0011>]TJ +1 0 0 1 253.001 685.805 Tm [<0012>]TJ ET EMC /Artifact BMC @@ -142,7 +137,7 @@ EMC /mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 282.889 697.76 Tm [<0011>]TJ +1 0 0 1 267.945 685.805 Tm [<0011>]TJ ET EMC /Artifact BMC @@ -150,7 +145,7 @@ EMC /mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 253.001 685.805 Tm [<0011>]TJ +1 0 0 1 282.889 685.805 Tm [<0011>]TJ ET EMC /Artifact BMC @@ -158,7 +153,7 @@ EMC /mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 267.945 685.805 Tm [<0012>]TJ +1 0 0 1 253.001 673.85 Tm [<0011>]TJ ET EMC /Artifact BMC @@ -166,7 +161,7 @@ EMC /mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 282.889 685.805 Tm [<0011>]TJ +1 0 0 1 267.945 673.85 Tm [<0012>]TJ ET EMC /Artifact BMC @@ -174,7 +169,7 @@ EMC /mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 253.001 673.85 Tm [<0011>]TJ +1 0 0 1 282.889 673.85 Tm [<0011>]TJ ET EMC /Artifact BMC @@ -182,7 +177,7 @@ EMC /mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 267.945 673.85 Tm [<0011>]TJ +1 0 0 1 253.001 661.895 Tm [<0011>]TJ ET EMC /Artifact BMC @@ -190,492 +185,506 @@ EMC /mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 282.889 673.85 Tm [<0012>]TJ +1 0 0 1 267.945 661.895 Tm [<0011>]TJ ET EMC /Artifact BMC EMC -/mo<> BDC +/mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 287.871 689.457 Tm [<09CC>]TJ -1 0 0 1 287.871 685.715 Tm [<09CB>]TJ -1 0 0 1 287.871 672.041 Tm [<09CA>]TJ +1 0 0 1 282.889 661.895 Tm [<0012>]TJ ET EMC +/Artifact BMC +EMC /mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 299.355 685.706 Tm [<001E>]TJ +1 0 0 1 287.871 677.502 Tm [<09CC>]TJ +1 0 0 1 287.871 673.76 Tm [<09CB>]TJ +1 0 0 1 287.871 660.086 Tm [<09CA>]TJ ET EMC /mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 309.873 685.705 Tm [<09D3>]TJ +1 0 0 1 299.355 673.751 Tm [<001E>]TJ ET EMC -/Artifact BMC -EMC -/mn<> BDC +/mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 318.859 692.5 Tm [<0012>]TJ +1 0 0 1 309.873 673.75 Tm [<09D3>]TJ ET EMC /Artifact BMC +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 318.859 680.545 Tm [<0012>]TJ +ET +EMC +/Artifact BMC +EMC +/mtext<> BDC BT /F23 9.96264 Tf -1 0 0 1 333.803 692.5 Tm [<004200370067>]TJ -ET -EMC -/mi<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 342.939 692.5 Tm [<0510>]TJ -ET -EMC -/mo<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 350.976 692.5 Tm [<001E>]TJ +1 0 0 1 333.803 680.545 Tm [<004200370067>]TJ ET EMC /mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 361.494 692.5 Tm [<0511>]TJ +1 0 0 1 342.939 680.545 Tm [<0510>]TJ ET EMC -/Artifact BMC -EMC -/mn<> BDC +/mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 318.859 678.154 Tm [<0013>]TJ -ET -EMC -/Artifact BMC -BT -/F23 9.96264 Tf -1 0 0 1 333.803 678.154 Tm [<0032004800620032>]TJ +1 0 0 1 350.976 680.545 Tm [<001E>]TJ ET EMC /mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 259.389 646.021 Tm [<0527>]TJ +1 0 0 1 361.494 680.545 Tm [<0511>]TJ ET EMC -/mo<> BDC +/Artifact BMC +EMC +/mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 267.855 646.021 Tm [<001E>]TJ +1 0 0 1 318.859 666.199 Tm [<0013>]TJ ET EMC -/mo<> BDC +/Artifact BMC +EMC +/mtext<> BDC BT -/F28 9.96264 Tf -1 0 0 1 279.569 652.765 Tm [<0A37>]TJ +/F23 9.96264 Tf +1 0 0 1 333.803 666.199 Tm [<0032004800620032>]TJ ET EMC +/Artifact BMC +EMC /mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 287.32 652.765 Tm [<0511>]TJ +1 0 0 1 259.389 634.066 Tm [<0527>]TJ ET EMC /mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 293.947 652.765 Tm [<0A3B>]TJ +1 0 0 1 267.855 634.066 Tm [<001E>]TJ ET EMC -/Artifact BMC +/mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 303.911 661.496 Tm [<0C05>]TJ +1 0 0 1 279.569 640.81 Tm [<0A37>]TJ ET -q -1 0 0 1 312.21 661.696 cm -[] 0 d 0 J 0.398 w 0 0 m 35.683 0 l S -Q EMC -/mi<> BDC +/mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 312.21 652.765 Tm [<0511>]TJ -ET -EMC -/mn<> BDC -BT -/F29 6.97385 Tf -1 0 0 1 316.624 655.644 Tm [<03F5>]TJ +1 0 0 1 287.32 640.81 Tm [<0511>]TJ ET EMC /mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 323.363 652.765 Tm [<0A37>]TJ -ET -EMC -/mn<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 333.328 652.765 Tm [<0015>]TJ -ET -EMC -/mi<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 338.309 652.765 Tm [<0510>]TJ -ET -EMC -/mi<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 343.579 652.765 Tm [<0512>]TJ +1 0 0 1 293.947 640.81 Tm [<0A3B>]TJ ET EMC /Artifact BMC +BT +/F28 9.96264 Tf +1 0 0 1 303.911 649.541 Tm [<0C05>]TJ +ET q -1 0 0 1 279.569 648.512 cm -[] 0 d 0 J 0.398 w 0 0 m 68.325 0 l S +1 0 0 1 312.21 649.74 cm +[] 0 d 0 J 0.398 w 0 0 m 35.683 0 l S Q EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 312.21 640.81 Tm [<0511>]TJ +ET +EMC +/mn<> BDC +BT +/F29 6.97385 Tf +1 0 0 1 316.624 643.689 Tm [<03F5>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 323.363 640.81 Tm [<0A37>]TJ +ET +EMC /mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 308.605 639.188 Tm [<0013>]TJ +1 0 0 1 333.328 640.81 Tm [<0015>]TJ ET EMC /mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 313.587 639.188 Tm [<0510>]TJ +1 0 0 1 338.309 640.81 Tm [<0510>]TJ ET EMC -/mo<> BDC +/mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 349.089 646.021 Tm [<000F>]TJ -ET -EMC -/mo<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 289.258 616.133 Tm [<0C02>]TJ -ET -EMC -/mi<> BDC -BT -/F29 6.97385 Tf -1 0 0 1 294.289 605.673 Tm [<057C>]TJ -ET -EMC -/mi<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 305.304 616.133 Tm [<0512>]TJ +1 0 0 1 343.579 640.81 Tm [<0512>]TJ ET EMC /Artifact BMC q -1 0 0 1 305.304 614.629 cm -[] 0 d 0 J 0.398 w 0 0 m 4.314 0 l S +1 0 0 1 279.569 636.556 cm +[] 0 d 0 J 0.398 w 0 0 m 68.325 0 l S Q EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 308.605 627.232 Tm [<0013>]TJ +ET +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 313.587 627.232 Tm [<0510>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 349.089 634.066 Tm [<000F>]TJ +ET +EMC /mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 313.902 618.564 Tm [<06FE>]TJ +1 0 0 1 289.258 604.178 Tm [<0C02>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 309.618 616.133 Tm [<0511>]TJ +/F29 6.97385 Tf +1 0 0 1 294.289 593.718 Tm [<057C>]TJ ET EMC /mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 314.031 616.133 Tm [<0512>]TJ -ET -EMC -/mi<> BDC -BT -/F29 6.97385 Tf -1 0 0 1 318.594 619.749 Tm [<0BA5>]TJ +1 0 0 1 305.304 604.178 Tm [<0512>]TJ ET EMC /Artifact BMC +q +1 0 0 1 305.304 602.674 cm +[] 0 d 0 J 0.398 w 0 0 m 4.314 0 l S +Q +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 313.902 606.609 Tm [<06FE>]TJ +ET EMC /mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 231.386 576.283 Tm [<0510>]TJ +1 0 0 1 309.618 604.178 Tm [<0511>]TJ ET EMC /mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 236.656 576.283 Tm [<0511>]TJ +1 0 0 1 314.031 604.178 Tm [<0512>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 241.07 576.283 Tm [<0512>]TJ +/F29 6.97385 Tf +1 0 0 1 318.594 607.794 Tm [<0BA5>]TJ ET EMC /Artifact BMC EMC -/mo<> BDC +/mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 248.151 576.283 Tm [<001E>]TJ +1 0 0 1 231.386 564.328 Tm [<0510>]TJ ET EMC /mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 258.669 576.283 Tm [<0513>]TJ +1 0 0 1 236.656 564.328 Tm [<0511>]TJ ET EMC /mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 264.088 576.283 Tm [<0514>]TJ -ET -EMC -/mi<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 268.731 576.283 Tm [<0515>]TJ +1 0 0 1 241.07 564.328 Tm [<0512>]TJ ET EMC /Artifact BMC EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 248.151 564.328 Tm [<001E>]TJ +ET +EMC /mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 356.482 576.283 Tm [<0514>]TJ +1 0 0 1 258.669 564.328 Tm [<0513>]TJ ET EMC /mi<> BDC BT -/F40 6.97385 Tf -1 0 0 1 361.124 579.899 Tm [<0042>]TJ +/F28 9.96264 Tf +1 0 0 1 264.088 564.328 Tm [<0514>]TJ ET EMC /mi<> BDC BT +/F28 9.96264 Tf +1 0 0 1 268.731 564.328 Tm [<0515>]TJ +ET +EMC +/Artifact BMC +EMC +/mi<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 356.482 564.328 Tm [<0514>]TJ +ET +EMC +/mi<> BDC +BT +/F40 6.97385 Tf +1 0 0 1 361.124 567.944 Tm [<0042>]TJ +ET +EMC +/mi<> BDC +BT /F29 6.97385 Tf -1 0 0 1 363.377 579.899 Tm [<11CE>]TJ +1 0 0 1 363.377 567.944 Tm [<11CE>]TJ ET EMC /Artifact BMC EMC -/mo<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 371.36 576.283 Tm [<001E>]TJ -ET -EMC -/mo<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 381.878 576.283 Tm [<0A37>]TJ -ET -EMC -/mn<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 389.629 576.283 Tm [<0012>]TJ -ET -EMC -/Artifact BMC -BT -/F23 9.96264 Tf -1 0 0 1 464.747 576.283 Tm [<005500520056>]TJ -ET -EMC /mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 216.637 555.8 Tm [<0997>]TJ +1 0 0 1 371.36 564.328 Tm [<001E>]TJ ET EMC -/mn<> BDC +/mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 223.243 555.8 Tm [<0012>]TJ +1 0 0 1 381.878 564.328 Tm [<0A37>]TJ ET EMC -/mo<> BDC +/mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 230.438 555.8 Tm [<000C>]TJ -ET -EMC -/mn<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 240.402 555.8 Tm [<0013>]TJ -ET -EMC -/Artifact BMC -EMC -/mo<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 248.151 555.8 Tm [<001E>]TJ -ET -EMC -/mn<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 258.669 555.8 Tm [<0014>]TJ -ET -EMC -/mo<> BDC -BT -/F28 9.96264 Tf -1 0 0 1 263.65 555.8 Tm [<0998>]TJ +1 0 0 1 389.629 564.328 Tm [<0012>]TJ ET EMC /Artifact BMC BT /F23 9.96264 Tf -1 0 0 1 464.747 555.8 Tm [<0055006B0056>]TJ +1 0 0 1 464.747 564.328 Tm [<005500520056>]TJ ET EMC -/mn<> BDC +/mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 240.402 535.516 Tm [<0016>]TJ +1 0 0 1 216.637 543.844 Tm [<0997>]TJ +ET +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 223.243 543.845 Tm [<0012>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 230.438 543.845 Tm [<000C>]TJ +ET +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 240.402 543.845 Tm [<0013>]TJ +ET +EMC +/Artifact BMC +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 248.151 543.845 Tm [<001E>]TJ +ET +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 258.669 543.845 Tm [<0014>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 263.65 543.844 Tm [<0998>]TJ ET EMC /Artifact BMC BT /F23 9.96264 Tf -1 0 0 1 464.747 535.516 Tm [<0055006A0056>]TJ -1 0 0 1 148.712 513.598 Tm [<003100620067003B0042004800690067>]TJ +1 0 0 1 464.747 543.845 Tm [<0055006B0056>]TJ ET EMC -/mi<> BDC -BT -/F23 9.96264 Tf -1 0 0 1 180.453 513.598 Tm [<0062>]TJ -ET -EMC -/mi<> BDC -BT -/F23 9.96264 Tf -1 0 0 1 184.379 513.598 Tm [<0042>]TJ -ET -EMC -/mi<> BDC -BT -/F23 9.96264 Tf -1 0 0 1 187.148 513.598 Tm [<004D>]TJ -ET -EMC -/mo<> BDC +/mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 192.687 513.598 Tm [<0009>]TJ +1 0 0 1 240.402 523.56 Tm [<0016>]TJ +ET +EMC +/Artifact BMC +BT +/F23 9.96264 Tf +1 0 0 1 464.747 523.56 Tm [<0055006A0056>]TJ +1 0 0 1 148.712 501.643 Tm [<003100620067003B0042004800690067>]TJ +ET +EMC +/mi<> BDC +BT +/F23 9.96264 Tf +1 0 0 1 180.453 501.643 Tm [<0062>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 196.563 513.598 Tm [<0527>]TJ +/F23 9.96264 Tf +1 0 0 1 184.379 501.643 Tm [<0042>]TJ ET EMC -/mo<> BDC +/mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 202.262 513.598 Tm [<000A>]TJ +/F23 9.96264 Tf +1 0 0 1 187.148 501.643 Tm [<004D>]TJ ET EMC /mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 208.351 513.598 Tm [<0A37>]TJ +1 0 0 1 192.687 501.643 Tm [<0009>]TJ ET EMC /mi<> BDC BT -/F23 9.96264 Tf -1 0 0 1 218.315 513.598 Tm [<0062>]TJ +/F28 9.96264 Tf +1 0 0 1 196.563 501.643 Tm [<0527>]TJ ET EMC -/mi<> BDC -BT -/F23 9.96264 Tf -1 0 0 1 222.241 513.598 Tm [<0042>]TJ -ET -EMC -/mi<> BDC -BT -/F23 9.96264 Tf -1 0 0 1 225.01 513.598 Tm [<004D>]TJ -ET -EMC -/mo<> BDC +/mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 230.549 513.598 Tm [<0009>]TJ +1 0 0 1 202.262 501.643 Tm [<000A>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 208.351 501.643 Tm [<0A37>]TJ +ET +EMC +/mi<> BDC +BT +/F23 9.96264 Tf +1 0 0 1 218.315 501.643 Tm [<0062>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 234.425 513.598 Tm [<0527>]TJ +/F23 9.96264 Tf +1 0 0 1 222.241 501.643 Tm [<0042>]TJ ET EMC -/mo<> BDC +/mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 242.337 513.598 Tm [<000C>]TJ +/F23 9.96264 Tf +1 0 0 1 225.01 501.643 Tm [<004D>]TJ ET EMC -/mn<> BDC +/mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 252.302 513.598 Tm [<0013>]TJ +1 0 0 1 230.549 501.643 Tm [<0009>]TJ ET EMC /mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 257.283 513.598 Tm [<117A>]TJ +1 0 0 1 234.425 501.643 Tm [<0527>]TJ ET EMC /mo<> BDC BT /F28 9.96264 Tf -1 0 0 1 263.211 513.598 Tm [<000A>]TJ +1 0 0 1 242.337 501.643 Tm [<000C>]TJ ET EMC -/mo<> BDC +/mn<> BDC BT /F28 9.96264 Tf -1 0 0 1 269.853 513.598 Tm [<001E>]TJ +1 0 0 1 252.302 501.643 Tm [<0013>]TJ ET EMC -/mn<> BDC +/mi<> BDC BT /F28 9.96264 Tf -1 0 0 1 280.371 513.598 Tm [<0011>]TJ +1 0 0 1 257.283 501.643 Tm [<117A>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 263.211 501.643 Tm [<000A>]TJ +ET +EMC +/mo<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 269.853 501.643 Tm [<001E>]TJ +ET +EMC +/mn<> BDC +BT +/F28 9.96264 Tf +1 0 0 1 280.371 501.643 Tm [<0011>]TJ ET EMC /Artifact BMC BT /F23 9.96264 Tf -1 0 0 1 285.353 513.598 Tm [<0058>]TJ +1 0 0 1 285.353 501.643 Tm [<0058>]TJ ET EMC /Artifact BMC @@ -688,20 +697,20 @@ EMC EMC endstream endobj -217 0 obj -<< /Type /Page /Contents 218 0 R /Resources 216 0 R /MediaBox [ 0 0 595.276 841.89 ] /StructParents 0/Tabs /S /Parent 223 0 R >> +232 0 obj +<< /Type /Page /Contents 233 0 R /Resources 231 0 R /MediaBox [ 0 0 595.276 841.89 ] /StructParents 0/Tabs /S /Parent 238 0 R >> endobj -216 0 obj -<< /ExtGState 1 0 R /Font << /F28 219 0 R /F23 220 0 R /F29 221 0 R /F40 222 0 R >> >> +231 0 obj +<< /ExtGState 1 0 R /Font << /F23 234 0 R /F28 235 0 R /F29 236 0 R /F40 237 0 R >> >> endobj 1 0 obj << /opacity1 <> >> endobj -224 0 obj +239 0 obj << /Marked true >> endobj 6 0 obj -<< /Nums [0 [ 58 0 R 21 0 R 23 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 69 0 R 70 0 R 72 0 R 39 0 R 46 0 R 47 0 R 49 0 R 51 0 R 88 0 R 89 0 R 92 0 R 94 0 R 95 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 107 0 R 108 0 R 109 0 R 116 0 R 118 0 R 120 0 R 124 0 R 123 0 R 127 0 R 128 0 R 134 0 R 135 0 R 136 0 R 139 0 R 140 0 R 141 0 R 142 0 R 145 0 R 147 0 R 148 0 R 151 0 R 153 0 R 154 0 R 156 0 R 158 0 R 159 0 R 160 0 R 163 0 R 164 0 R 165 0 R 171 0 R 195 0 R 196 0 R 197 0 R 198 0 R 200 0 R 201 0 R 202 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R] +<< /Nums [0 [ 18 0 R 78 0 R 22 0 R 24 0 R 26 0 R 28 0 R 30 0 R 32 0 R 34 0 R 36 0 R 38 0 R 89 0 R 90 0 R 92 0 R 40 0 R 49 0 R 51 0 R 52 0 R 53 0 R 68 0 R 70 0 R 103 0 R 104 0 R 107 0 R 109 0 R 110 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 122 0 R 123 0 R 124 0 R 131 0 R 133 0 R 135 0 R 139 0 R 138 0 R 142 0 R 143 0 R 149 0 R 150 0 R 151 0 R 154 0 R 155 0 R 156 0 R 157 0 R 160 0 R 162 0 R 163 0 R 166 0 R 168 0 R 169 0 R 171 0 R 173 0 R 174 0 R 175 0 R 178 0 R 179 0 R 180 0 R 186 0 R 210 0 R 211 0 R 212 0 R 213 0 R 215 0 R 216 0 R 217 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R] ] >> endobj 7 0 obj @@ -723,529 +732,577 @@ endobj [ 9 0 R 11 0 R 13 0 R 15 0 R ] endobj 17 0 obj -<< /Type /StructElem /S /Document /P 5 0 R /K [19 0 R 86 0 R 113 0 R 132 0 R 192 0 R] /NS 11 0 R >> +<< /Type /StructElem /S /Document /P 5 0 R /K [18 0 R 20 0 R 101 0 R 128 0 R 147 0 R 207 0 R] /NS 11 0 R >> endobj -19 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K [40 0 R 52 0 R 55 0 R] /AF 18 0 R /NS 11 0 R >> +18 0 obj +<< /Type /StructElem /S /P /P 17 0 R /K <> /NS 11 0 R >> endobj 20 0 obj -<< /Type /StructElem /S /mtd /P 65 0 R /K 21 0 R /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 17 0 R /K 75 0 R /AF 19 0 R /NS 11 0 R >> endobj 21 0 obj -<< /Type /StructElem /S /mn /P 20 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 85 0 R /K 22 0 R /NS 13 0 R >> endobj 22 0 obj -<< /Type /StructElem /S /mtd /P 65 0 R /K 23 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 21 0 R /K <> /NS 13 0 R >> endobj 23 0 obj -<< /Type /StructElem /S /mn /P 22 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 85 0 R /K 24 0 R /NS 13 0 R >> endobj 24 0 obj -<< /Type /StructElem /S /mtd /P 65 0 R /K 25 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 23 0 R /K <> /NS 13 0 R >> endobj 25 0 obj -<< /Type /StructElem /S /mn /P 24 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 85 0 R /K 26 0 R /NS 13 0 R >> endobj 26 0 obj -<< /Type /StructElem /S /mtd /P 66 0 R /K 27 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 25 0 R /K <> /NS 13 0 R >> endobj 27 0 obj -<< /Type /StructElem /S /mn /P 26 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 86 0 R /K 28 0 R /NS 13 0 R >> endobj 28 0 obj -<< /Type /StructElem /S /mtd /P 66 0 R /K 29 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 27 0 R /K <> /NS 13 0 R >> endobj 29 0 obj -<< /Type /StructElem /S /mn /P 28 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 86 0 R /K 30 0 R /NS 13 0 R >> endobj 30 0 obj -<< /Type /StructElem /S /mtd /P 66 0 R /K 31 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 29 0 R /K <> /NS 13 0 R >> endobj 31 0 obj -<< /Type /StructElem /S /mn /P 30 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 86 0 R /K 32 0 R /NS 13 0 R >> endobj 32 0 obj -<< /Type /StructElem /S /mtd /P 67 0 R /K 33 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 31 0 R /K <> /NS 13 0 R >> endobj 33 0 obj -<< /Type /StructElem /S /mn /P 32 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 87 0 R /K 34 0 R /NS 13 0 R >> endobj 34 0 obj -<< /Type /StructElem /S /mtd /P 67 0 R /K 35 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 33 0 R /K <> /NS 13 0 R >> endobj 35 0 obj -<< /Type /StructElem /S /mn /P 34 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 87 0 R /K 36 0 R /NS 13 0 R >> endobj 36 0 obj -<< /Type /StructElem /S /mtd /P 67 0 R /K 37 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 35 0 R /K <> /NS 13 0 R >> endobj 37 0 obj -<< /Type /StructElem /S /mn /P 36 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 87 0 R /K 38 0 R /NS 13 0 R >> endobj 38 0 obj -<< /Type /StructElem /S /mtd /P 75 0 R /K 39 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 37 0 R /K <> /NS 13 0 R >> endobj 39 0 obj -<< /Type /StructElem /S /mn /P 38 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 95 0 R /K 40 0 R /NS 13 0 R >> endobj 40 0 obj -<< /Type /StructElem /S /math /P 19 0 R /K [41 0 R 43 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 39 0 R /K <> /NS 13 0 R >> endobj 41 0 obj -<< /Type /StructElem /S /mspace /P 40 0 R /A 42 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K [ 42 0 R] /NS 13 0 R >> +endobj +42 0 obj +<< /Type /StructElem /S /math /P 41 0 R /K 43 0 R /NS 13 0 R >> endobj 43 0 obj -<< /Type /StructElem /S /mi /P 40 0 R /A 44 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mstyle /P 42 0 R /K [45 0 R 46 0 R 48 0 R] /A 44 0 R /NS 13 0 R >> endobj 45 0 obj -<< /Type /StructElem /S /mtd /P 78 0 R /K [46 0 R 47 0 R 49 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 43 0 R /K null /NS 13 0 R >> endobj 46 0 obj -<< /Type /StructElem /S /mi /P 45 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 43 0 R /K null /A 47 0 R /NS 13 0 R >> endobj -47 0 obj -<< /Type /StructElem /S /mo /P 45 0 R /K <> /A 48 0 R /NS 13 0 R >> +48 0 obj +<< /Type /StructElem /S /mi /P 43 0 R /K null /NS 13 0 R >> endobj 49 0 obj -<< /Type /StructElem /S /mi /P 45 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 64 0 R /K [<> 50 0 R] /NS 13 0 R >> endobj 50 0 obj -<< /Type /StructElem /S /mtd /P 79 0 R /K 51 0 R /NS 13 0 R >> +<< /Type /StructElem /S /math /P 49 0 R /K [51 0 R 52 0 R 53 0 R] /NS 13 0 R >> endobj 51 0 obj -<< /Type /StructElem /S /mn /P 50 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 50 0 R /K <> /NS 13 0 R >> endobj 52 0 obj -<< /Type /StructElem /S /math /P 19 0 R /K [53 0 R 54 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 50 0 R /K <> /A 47 0 R /NS 13 0 R >> endobj 53 0 obj -<< /Type /StructElem /S /mspace /P 52 0 R /A 42 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 50 0 R /K <> /NS 13 0 R >> endobj 54 0 obj -<< /Type /StructElem /S /mi /P 52 0 R /A 44 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K [ 55 0 R] /NS 13 0 R >> endobj 55 0 obj -<< /Type /StructElem /S /math /P 19 0 R /K [57 0 R 70 0 R 71 0 R] /A 56 0 R /NS 13 0 R >> +<< /Type /StructElem /S /math /P 54 0 R /K [56 0 R 57 0 R 58 0 R] /NS 13 0 R >> +endobj +56 0 obj +<< /Type /StructElem /S /mi /P 55 0 R /K null /NS 13 0 R >> endobj 57 0 obj -<< /Type /StructElem /S /mrow /P 55 0 R /K [58 0 R 60 0 R 62 0 R 68 0 R 69 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 55 0 R /K null /A 47 0 R /NS 13 0 R >> endobj 58 0 obj -<< /Type /StructElem /S /mo /P 57 0 R /K <> /A 59 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 55 0 R /K null /NS 13 0 R >> +endobj +59 0 obj +<< /Type /StructElem /S /mtext /K [ 60 0 R] /NS 13 0 R >> endobj 60 0 obj -<< /Type /StructElem /S /mspace /P 57 0 R /A 61 0 R /NS 13 0 R >> +<< /Type /StructElem /S /math /P 59 0 R /K [61 0 R 62 0 R 63 0 R] /NS 13 0 R >> +endobj +61 0 obj +<< /Type /StructElem /S /mi /P 60 0 R /K null /NS 13 0 R >> endobj 62 0 obj -<< /Type /StructElem /S /mpadded /P 57 0 R /K 64 0 R /A 63 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 60 0 R /K null /A 47 0 R /NS 13 0 R >> +endobj +63 0 obj +<< /Type /StructElem /S /mi /P 60 0 R /K null /NS 13 0 R >> endobj 64 0 obj -<< /Type /StructElem /S /mtable /P 62 0 R /K [65 0 R 66 0 R 67 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 95 0 R /K [49 0 R 65 0 R] /NS 13 0 R >> endobj 65 0 obj -<< /Type /StructElem /S /mtr /P 64 0 R /K [20 0 R 22 0 R 24 0 R] /NS 13 0 R >> -endobj -66 0 obj -<< /Type /StructElem /S /mtr /P 64 0 R /K [26 0 R 28 0 R 30 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 64 0 R /A 66 0 R /NS 13 0 R >> endobj 67 0 obj -<< /Type /StructElem /S /mtr /P 64 0 R /K [32 0 R 34 0 R 36 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 96 0 R /K 68 0 R /NS 13 0 R >> endobj 68 0 obj -<< /Type /StructElem /S /mspace /P 57 0 R /A 61 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 67 0 R /K <> /NS 13 0 R >> endobj 69 0 obj -<< /Type /StructElem /S /mo /P 57 0 R /K <> /A 59 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K null /NS 13 0 R >> endobj 70 0 obj -<< /Type /StructElem /S /mo /P 55 0 R /K <> /A 48 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 73 0 R /K <> /NS 13 0 R >> endobj 71 0 obj -<< /Type /StructElem /S /mrow /P 55 0 R /K [72 0 R 73 0 R 82 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K null /NS 13 0 R >> endobj 72 0 obj -<< /Type /StructElem /S /mo /P 71 0 R /K <> /A 59 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K null /NS 13 0 R >> endobj 73 0 obj -<< /Type /StructElem /S /mpadded /P 71 0 R /K 74 0 R /A 63 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 96 0 R /K [70 0 R 74 0 R] /NS 13 0 R >> endobj 74 0 obj -<< /Type /StructElem /S /mtable /P 73 0 R /K [75 0 R 79 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 73 0 R /A 66 0 R /NS 13 0 R >> endobj 75 0 obj -<< /Type /StructElem /S /mtr /P 74 0 R /K [38 0 R 76 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /math /P 20 0 R /K [77 0 R 90 0 R 91 0 R] /A 76 0 R /NS 13 0 R >> endobj -76 0 obj -<< /Type /StructElem /S /mtd /P 75 0 R /K 78 0 R /A 77 0 R /NS 13 0 R >> +77 0 obj +<< /Type /StructElem /S /mrow /P 75 0 R /K [78 0 R 80 0 R 82 0 R 88 0 R 89 0 R] /NS 13 0 R >> endobj 78 0 obj -<< /Type /StructElem /S /mtext /P 76 0 R /K 45 0 R /NS 13 0 R >> -endobj -79 0 obj -<< /Type /StructElem /S /mtr /P 74 0 R /K [50 0 R 80 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 77 0 R /K <> /A 79 0 R /ActualText /NS 13 0 R >> endobj 80 0 obj -<< /Type /StructElem /S /mtd /P 79 0 R /K 81 0 R /A 77 0 R /NS 13 0 R >> -endobj -81 0 obj -<< /Type /StructElem /S /mtext /P 80 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mspace /P 77 0 R /A 81 0 R /NS 13 0 R >> endobj 82 0 obj -<< /Type /StructElem /S /mspace /P 71 0 R /A 83 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mpadded /P 77 0 R /K 84 0 R /A 83 0 R /NS 13 0 R >> +endobj +84 0 obj +<< /Type /StructElem /S /mtable /P 82 0 R /K [85 0 R 86 0 R 87 0 R] /NS 13 0 R >> +endobj +85 0 obj +<< /Type /StructElem /S /mtr /P 84 0 R /K [21 0 R 23 0 R 25 0 R] /NS 13 0 R >> endobj 86 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 87 0 R /AF 85 0 R /NS 11 0 R >> +<< /Type /StructElem /S /mtr /P 84 0 R /K [27 0 R 29 0 R 31 0 R] /NS 13 0 R >> endobj 87 0 obj -<< /Type /StructElem /S /math /P 86 0 R /K [88 0 R 89 0 R 90 0 R 109 0 R] /A 56 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtr /P 84 0 R /K [33 0 R 35 0 R 37 0 R] /NS 13 0 R >> endobj 88 0 obj -<< /Type /StructElem /S /mi /P 87 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mspace /P 77 0 R /A 81 0 R /NS 13 0 R >> endobj 89 0 obj -<< /Type /StructElem /S /mo /P 87 0 R /K <> /A 48 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 77 0 R /K <> /A 79 0 R /ActualText /NS 13 0 R >> endobj 90 0 obj -<< /Type /StructElem /S /mfrac /P 87 0 R /K [91 0 R 106 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 75 0 R /K <> /A 47 0 R /NS 13 0 R >> endobj 91 0 obj -<< /Type /StructElem /S /mrow /P 90 0 R /K [92 0 R 94 0 R 95 0 R 97 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 75 0 R /K [92 0 R 93 0 R 97 0 R] /NS 13 0 R >> endobj 92 0 obj -<< /Type /StructElem /S /mo /P 91 0 R /K <> /A 93 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 91 0 R /K <> /A 79 0 R /ActualText /NS 13 0 R >> +endobj +93 0 obj +<< /Type /StructElem /S /mpadded /P 91 0 R /K 94 0 R /A 83 0 R /NS 13 0 R >> endobj 94 0 obj -<< /Type /StructElem /S /mi /P 91 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtable /P 93 0 R /K [95 0 R 96 0 R] /NS 13 0 R >> endobj 95 0 obj -<< /Type /StructElem /S /mo /P 91 0 R /K <> /A 96 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtr /P 94 0 R /K [39 0 R 64 0 R] /NS 13 0 R >> +endobj +96 0 obj +<< /Type /StructElem /S /mtr /P 94 0 R /K [67 0 R 73 0 R] /NS 13 0 R >> endobj 97 0 obj -<< /Type /StructElem /S /msqrt /P 91 0 R /K 98 0 R /NS 13 0 R >> -endobj -98 0 obj -<< /Type /StructElem /S /mrow /P 97 0 R /K [99 0 R 102 0 R 103 0 R 104 0 R 105 0 R] /NS 13 0 R >> -endobj -99 0 obj -<< /Type /StructElem /S /msup /P 98 0 R /K [100 0 R 101 0 R] /NS 13 0 R >> -endobj -100 0 obj -<< /Type /StructElem /S /mi /P 99 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mspace /P 91 0 R /A 98 0 R /NS 13 0 R >> endobj 101 0 obj -<< /Type /StructElem /S /mn /P 99 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 17 0 R /K 102 0 R /AF 100 0 R /NS 11 0 R >> endobj 102 0 obj -<< /Type /StructElem /S /mo /P 98 0 R /K <> /A 96 0 R /NS 13 0 R >> +<< /Type /StructElem /S /math /P 101 0 R /K [103 0 R 104 0 R 105 0 R 124 0 R] /A 76 0 R /NS 13 0 R >> endobj 103 0 obj -<< /Type /StructElem /S /mn /P 98 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 102 0 R /K <> /NS 13 0 R >> endobj 104 0 obj -<< /Type /StructElem /S /mi /P 98 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 102 0 R /K <> /A 47 0 R /NS 13 0 R >> endobj 105 0 obj -<< /Type /StructElem /S /mi /P 98 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mfrac /P 102 0 R /K [106 0 R 121 0 R] /NS 13 0 R >> endobj 106 0 obj -<< /Type /StructElem /S /mrow /P 90 0 R /K [107 0 R 108 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 105 0 R /K [107 0 R 109 0 R 110 0 R 112 0 R] /NS 13 0 R >> endobj 107 0 obj -<< /Type /StructElem /S /mn /P 106 0 R /K <> /NS 13 0 R >> -endobj -108 0 obj -<< /Type /StructElem /S /mi /P 106 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 106 0 R /K <> /A 108 0 R /NS 13 0 R >> endobj 109 0 obj -<< /Type /StructElem /S /mo /P 87 0 R /K <> /A 110 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 106 0 R /K <> /NS 13 0 R >> +endobj +110 0 obj +<< /Type /StructElem /S /mo /P 106 0 R /K <> /A 111 0 R /NS 13 0 R >> +endobj +112 0 obj +<< /Type /StructElem /S /msqrt /P 106 0 R /K 113 0 R /NS 13 0 R >> endobj 113 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 114 0 R /AF 112 0 R /NS 11 0 R >> +<< /Type /StructElem /S /mrow /P 112 0 R /K [114 0 R 117 0 R 118 0 R 119 0 R 120 0 R] /NS 13 0 R >> endobj 114 0 obj -<< /Type /StructElem /S /math /P 113 0 R /K [115 0 R 119 0 R 122 0 R 126 0 R] /A 56 0 R /NS 13 0 R >> +<< /Type /StructElem /S /msup /P 113 0 R /K [115 0 R 116 0 R] /NS 13 0 R >> endobj 115 0 obj -<< /Type /StructElem /S /munder /P 114 0 R /K [116 0 R 118 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 114 0 R /K <> /NS 13 0 R >> endobj 116 0 obj -<< /Type /StructElem /S /mo /P 115 0 R /K <> /A 117 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 114 0 R /K <> /NS 13 0 R >> +endobj +117 0 obj +<< /Type /StructElem /S /mo /P 113 0 R /K <> /A 111 0 R /NS 13 0 R >> endobj 118 0 obj -<< /Type /StructElem /S /mi /P 115 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 113 0 R /K <> /NS 13 0 R >> endobj 119 0 obj -<< /Type /StructElem /S /munder /P 114 0 R /K [120 0 R 121 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 113 0 R /K <> /NS 13 0 R >> endobj 120 0 obj -<< /Type /StructElem /S /mi /P 119 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 113 0 R /K <> /NS 13 0 R >> endobj 121 0 obj -<< /Type /StructElem /S /mo /P 119 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 105 0 R /K [122 0 R 123 0 R] /NS 13 0 R >> endobj 122 0 obj -<< /Type /StructElem /S /mover /P 114 0 R /K [123 0 R 124 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 121 0 R /K <> /NS 13 0 R >> endobj 123 0 obj -<< /Type /StructElem /S /mi /P 122 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 121 0 R /K <> /NS 13 0 R >> endobj 124 0 obj -<< /Type /StructElem /S /mo /P 122 0 R /K <> /A 125 0 R /ActualText /NS 13 0 R >> -endobj -126 0 obj -<< /Type /StructElem /S /msup /P 114 0 R /K [127 0 R 128 0 R] /NS 13 0 R >> -endobj -127 0 obj -<< /Type /StructElem /S /mi /P 126 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 102 0 R /K <> /A 125 0 R /NS 13 0 R >> endobj 128 0 obj -<< /Type /StructElem /S /mi /P 126 0 R /K <> /A 129 0 R /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 17 0 R /K 129 0 R /AF 127 0 R /NS 11 0 R >> endobj -132 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 178 0 R /AF 131 0 R /NS 11 0 R >> +129 0 obj +<< /Type /StructElem /S /math /P 128 0 R /K [130 0 R 134 0 R 137 0 R 141 0 R] /A 76 0 R /NS 13 0 R >> +endobj +130 0 obj +<< /Type /StructElem /S /munder /P 129 0 R /K [131 0 R 133 0 R] /NS 13 0 R >> +endobj +131 0 obj +<< /Type /StructElem /S /mo /P 130 0 R /K <> /A 132 0 R /NS 13 0 R >> endobj 133 0 obj -<< /Type /StructElem /S /mtd /P 181 0 R /K [134 0 R 135 0 R 136 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 130 0 R /K <> /NS 13 0 R >> endobj 134 0 obj -<< /Type /StructElem /S /mi /P 133 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /munder /P 129 0 R /K [135 0 R 136 0 R] /NS 13 0 R >> endobj 135 0 obj -<< /Type /StructElem /S /mi /P 133 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 134 0 R /K <> /NS 13 0 R >> endobj 136 0 obj -<< /Type /StructElem /S /mi /P 133 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 134 0 R /NS 13 0 R >> endobj 137 0 obj -<< /Type /StructElem /S /mtd /P 181 0 R /K [138 0 R 139 0 R 140 0 R 141 0 R 142 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mover /P 129 0 R /K [138 0 R 139 0 R] /NS 13 0 R >> endobj 138 0 obj -<< /Type /StructElem /S /mi /P 137 0 R /A 44 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 137 0 R /K <> /NS 13 0 R >> endobj 139 0 obj -<< /Type /StructElem /S /mo /P 137 0 R /K <> /A 48 0 R /NS 13 0 R >> -endobj -140 0 obj -<< /Type /StructElem /S /mi /P 137 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 137 0 R /K <> /A 140 0 R /ActualText /NS 13 0 R >> endobj 141 0 obj -<< /Type /StructElem /S /mi /P 137 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /msup /P 129 0 R /K [142 0 R 143 0 R] /NS 13 0 R >> endobj 142 0 obj -<< /Type /StructElem /S /mi /P 137 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 141 0 R /K <> /NS 13 0 R >> endobj 143 0 obj -<< /Type /StructElem /S /mtd /P 181 0 R /K 144 0 R /NS 13 0 R >> -endobj -144 0 obj -<< /Type /StructElem /S /msup /P 143 0 R /K [145 0 R 146 0 R] /NS 13 0 R >> -endobj -145 0 obj -<< /Type /StructElem /S /mi /P 144 0 R /K <> /NS 13 0 R >> -endobj -146 0 obj -<< /Type /StructElem /S /mrow /P 144 0 R /K [147 0 R 148 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 141 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 147 0 obj -<< /Type /StructElem /S /mi /P 146 0 R /K <> /A 129 0 R /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 17 0 R /K 193 0 R /AF 146 0 R /NS 11 0 R >> endobj 148 0 obj -<< /Type /StructElem /S /mi /P 146 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 196 0 R /K [149 0 R 150 0 R 151 0 R] /NS 13 0 R >> endobj 149 0 obj -<< /Type /StructElem /S /mtd /P 181 0 R /K [150 0 R 151 0 R 153 0 R 154 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 148 0 R /K <> /NS 13 0 R >> endobj 150 0 obj -<< /Type /StructElem /S /mi /P 149 0 R /A 44 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 148 0 R /K <> /NS 13 0 R >> endobj 151 0 obj -<< /Type /StructElem /S /mo /P 149 0 R /K <> /A 152 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 148 0 R /K <> /NS 13 0 R >> +endobj +152 0 obj +<< /Type /StructElem /S /mtd /P 196 0 R /K [153 0 R 154 0 R 155 0 R 156 0 R 157 0 R] /NS 13 0 R >> endobj 153 0 obj -<< /Type /StructElem /S /mo /P 149 0 R /K <> /A 152 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 152 0 R /A 66 0 R /NS 13 0 R >> endobj 154 0 obj -<< /Type /StructElem /S /mn /P 149 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 152 0 R /K <> /A 47 0 R /NS 13 0 R >> endobj 155 0 obj -<< /Type /StructElem /S /mtd /P 184 0 R /K [156 0 R 158 0 R 159 0 R 160 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 152 0 R /K <> /NS 13 0 R >> endobj 156 0 obj -<< /Type /StructElem /S /mo /P 155 0 R /K <> /A 157 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 152 0 R /K <> /NS 13 0 R >> +endobj +157 0 obj +<< /Type /StructElem /S /mi /P 152 0 R /K <> /NS 13 0 R >> endobj 158 0 obj -<< /Type /StructElem /S /mn /P 155 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 196 0 R /K 159 0 R /NS 13 0 R >> endobj 159 0 obj -<< /Type /StructElem /S /mo /P 155 0 R /K <> /A 96 0 R /NS 13 0 R >> +<< /Type /StructElem /S /msup /P 158 0 R /K [160 0 R 161 0 R] /NS 13 0 R >> endobj 160 0 obj -<< /Type /StructElem /S /mn /P 155 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 159 0 R /K <> /NS 13 0 R >> endobj 161 0 obj -<< /Type /StructElem /S /mtd /P 184 0 R /K [162 0 R 163 0 R 164 0 R 165 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 159 0 R /K [162 0 R 163 0 R] /NS 13 0 R >> endobj 162 0 obj -<< /Type /StructElem /S /mi /P 161 0 R /A 44 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 161 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 163 0 obj -<< /Type /StructElem /S /mo /P 161 0 R /K <> /A 48 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 161 0 R /K <> /NS 13 0 R >> endobj 164 0 obj -<< /Type /StructElem /S /mn /P 161 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 196 0 R /K [165 0 R 166 0 R 168 0 R 169 0 R] /NS 13 0 R >> endobj 165 0 obj -<< /Type /StructElem /S /mo /P 161 0 R /K <> /A 157 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 164 0 R /A 66 0 R /NS 13 0 R >> endobj 166 0 obj -<< /Type /StructElem /S /mtd /P 184 0 R /K 167 0 R /NS 13 0 R >> -endobj -167 0 obj -<< /Type /StructElem /S /mi /P 166 0 R /A 44 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 164 0 R /K <> /A 167 0 R /NS 13 0 R >> endobj 168 0 obj -<< /Type /StructElem /S /mtd /P 184 0 R /K 169 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 164 0 R /K <> /A 167 0 R /NS 13 0 R >> endobj 169 0 obj -<< /Type /StructElem /S /mi /P 168 0 R /A 44 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 164 0 R /K <> /NS 13 0 R >> endobj 170 0 obj -<< /Type /StructElem /S /mtd /P 187 0 R /K 171 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 199 0 R /K [171 0 R 173 0 R 174 0 R 175 0 R] /NS 13 0 R >> endobj 171 0 obj -<< /Type /StructElem /S /mn /P 170 0 R /K <> /NS 13 0 R >> -endobj -172 0 obj -<< /Type /StructElem /S /mtd /P 187 0 R /K 173 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 170 0 R /K <> /A 172 0 R /ActualText /NS 13 0 R >> endobj 173 0 obj -<< /Type /StructElem /S /mi /P 172 0 R /A 44 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 170 0 R /K <> /NS 13 0 R >> endobj 174 0 obj -<< /Type /StructElem /S /mtd /P 187 0 R /K 175 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 170 0 R /K <> /A 111 0 R /NS 13 0 R >> endobj 175 0 obj -<< /Type /StructElem /S /mi /P 174 0 R /A 44 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 170 0 R /K <> /NS 13 0 R >> endobj 176 0 obj -<< /Type /StructElem /S /mtd /P 187 0 R /K 177 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 199 0 R /K [177 0 R 178 0 R 179 0 R 180 0 R] /NS 13 0 R >> endobj 177 0 obj -<< /Type /StructElem /S /mi /P 176 0 R /A 44 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 176 0 R /A 66 0 R /NS 13 0 R >> endobj 178 0 obj -<< /Type /StructElem /S /math /P 132 0 R /K 179 0 R /A 56 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 176 0 R /K <> /A 47 0 R /NS 13 0 R >> endobj 179 0 obj -<< /Type /StructElem /S /mtable /P 178 0 R /K [181 0 R 184 0 R 187 0 R] /A 180 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 176 0 R /K <> /NS 13 0 R >> +endobj +180 0 obj +<< /Type /StructElem /S /mo /P 176 0 R /K <> /A 172 0 R /ActualText /NS 13 0 R >> endobj 181 0 obj -<< /Type /StructElem /S /mlabeledtr /P 179 0 R /K [182 0 R 133 0 R 137 0 R 143 0 R 149 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 199 0 R /K 182 0 R /NS 13 0 R >> endobj 182 0 obj -<< /Type /StructElem /S /mtd /P 181 0 R /K 183 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 181 0 R /A 66 0 R /NS 13 0 R >> endobj 183 0 obj -<< /Type /StructElem /S /mtext /P 182 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 199 0 R /K 184 0 R /NS 13 0 R >> endobj 184 0 obj -<< /Type /StructElem /S /mlabeledtr /P 179 0 R /K [185 0 R 155 0 R 161 0 R 166 0 R 168 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 183 0 R /A 66 0 R /NS 13 0 R >> endobj 185 0 obj -<< /Type /StructElem /S /mtd /P 184 0 R /K 186 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 202 0 R /K 186 0 R /NS 13 0 R >> endobj 186 0 obj -<< /Type /StructElem /S /mtext /P 185 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 185 0 R /K <> /NS 13 0 R >> endobj 187 0 obj -<< /Type /StructElem /S /mlabeledtr /P 179 0 R /K [188 0 R 170 0 R 172 0 R 174 0 R 176 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 202 0 R /K 188 0 R /NS 13 0 R >> endobj 188 0 obj -<< /Type /StructElem /S /mtd /P 187 0 R /K 189 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 187 0 R /A 66 0 R /NS 13 0 R >> endobj 189 0 obj -<< /Type /StructElem /S /mtext /P 188 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 202 0 R /K 190 0 R /NS 13 0 R >> +endobj +190 0 obj +<< /Type /StructElem /S /mi /P 189 0 R /A 66 0 R /NS 13 0 R >> +endobj +191 0 obj +<< /Type /StructElem /S /mtd /P 202 0 R /K 192 0 R /NS 13 0 R >> endobj 192 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 193 0 R /AF 191 0 R /NS 11 0 R >> +<< /Type /StructElem /S /mi /P 191 0 R /A 66 0 R /NS 13 0 R >> endobj 193 0 obj -<< /Type /StructElem /S /math /P 192 0 R /K [194 0 R 198 0 R 200 0 R 201 0 R 202 0 R 203 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /math /P 147 0 R /K 194 0 R /A 76 0 R /NS 13 0 R >> endobj 194 0 obj -<< /Type /StructElem /S /mrow /P 193 0 R /K [195 0 R 196 0 R 197 0 R] /NS 13 0 R >> -endobj -195 0 obj -<< /Type /StructElem /S /mi /P 194 0 R /K <> /A 129 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtable /P 193 0 R /K [196 0 R 199 0 R 202 0 R] /A 195 0 R /NS 13 0 R >> endobj 196 0 obj -<< /Type /StructElem /S /mi /P 194 0 R /K <> /A 129 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mlabeledtr /P 194 0 R /K [197 0 R 148 0 R 152 0 R 158 0 R 164 0 R] /NS 13 0 R >> endobj 197 0 obj -<< /Type /StructElem /S /mi /P 194 0 R /K <> /A 129 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 196 0 R /K 198 0 R /NS 13 0 R >> endobj 198 0 obj -<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 199 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 197 0 R /NS 13 0 R >> +endobj +199 0 obj +<< /Type /StructElem /S /mlabeledtr /P 194 0 R /K [200 0 R 170 0 R 176 0 R 181 0 R 183 0 R] /NS 13 0 R >> endobj 200 0 obj -<< /Type /StructElem /S /mi /P 193 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 199 0 R /K 201 0 R /NS 13 0 R >> endobj 201 0 obj -<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 199 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 200 0 R /NS 13 0 R >> endobj 202 0 obj -<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 96 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mlabeledtr /P 194 0 R /K [203 0 R 185 0 R 187 0 R 189 0 R 191 0 R] /NS 13 0 R >> endobj 203 0 obj -<< /Type /StructElem /S /mrow /P 193 0 R /K [204 0 R 205 0 R 206 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 202 0 R /K 204 0 R /NS 13 0 R >> endobj 204 0 obj -<< /Type /StructElem /S /mi /P 203 0 R /K <> /A 129 0 R /NS 13 0 R >> -endobj -205 0 obj -<< /Type /StructElem /S /mi /P 203 0 R /K <> /A 129 0 R /NS 13 0 R >> -endobj -206 0 obj -<< /Type /StructElem /S /mi /P 203 0 R /K <> /A 129 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 203 0 R /NS 13 0 R >> endobj 207 0 obj -<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 199 0 R /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 17 0 R /K 208 0 R /AF 206 0 R /NS 11 0 R >> endobj 208 0 obj -<< /Type /StructElem /S /mi /P 193 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /math /P 207 0 R /K [209 0 R 213 0 R 215 0 R 216 0 R 217 0 R 218 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R] /NS 13 0 R >> endobj 209 0 obj -<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 96 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 208 0 R /K [210 0 R 211 0 R 212 0 R] /NS 13 0 R >> endobj 210 0 obj -<< /Type /StructElem /S /mn /P 193 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 209 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 211 0 obj -<< /Type /StructElem /S /mi /P 193 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 209 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 212 0 obj -<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 199 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 209 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 213 0 obj -<< /Type /StructElem /S /mo /P 193 0 R /K <> /A 48 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> endobj -214 0 obj -<< /Type /StructElem /S /mn /P 193 0 R /K <> /NS 13 0 R >> +215 0 obj +<< /Type /StructElem /S /mi /P 208 0 R /K <> /NS 13 0 R >> +endobj +216 0 obj +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> +endobj +217 0 obj +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 111 0 R /NS 13 0 R >> +endobj +218 0 obj +<< /Type /StructElem /S /mrow /P 208 0 R /K [219 0 R 220 0 R 221 0 R] /NS 13 0 R >> +endobj +219 0 obj +<< /Type /StructElem /S /mi /P 218 0 R /K <> /A 144 0 R /NS 13 0 R >> +endobj +220 0 obj +<< /Type /StructElem /S /mi /P 218 0 R /K <> /A 144 0 R /NS 13 0 R >> +endobj +221 0 obj +<< /Type /StructElem /S /mi /P 218 0 R /K <> /A 144 0 R /NS 13 0 R >> +endobj +222 0 obj +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> +endobj +223 0 obj +<< /Type /StructElem /S /mi /P 208 0 R /K <> /NS 13 0 R >> +endobj +224 0 obj +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 111 0 R /NS 13 0 R >> +endobj +225 0 obj +<< /Type /StructElem /S /mn /P 208 0 R /K <> /NS 13 0 R >> +endobj +226 0 obj +<< /Type /StructElem /S /mi /P 208 0 R /K <> /NS 13 0 R >> +endobj +227 0 obj +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> +endobj +228 0 obj +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 47 0 R /NS 13 0 R >> +endobj +229 0 obj +<< /Type /StructElem /S /mn /P 208 0 R /K <> /NS 13 0 R >> endobj 5 0 obj << /Type /StructTreeRoot /K 17 0 R /ParentTree 6 0 R /RoleMap 7 0 R /Namespaces 8 0 R >> endobj -225 0 obj +240 0 obj [ 66 [ 323 ] ] endobj -227 0 obj +242 0 obj << /Subtype /CIDFontType0C /Length 592 >> [BINARY STREAM] endobj -226 0 obj -<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 227 0 R >> +241 0 obj +<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 242 0 R >> endobj -228 0 obj +243 0 obj << /Length 687 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1281,23 +1338,23 @@ end %%EOF endstream endobj -222 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 229 0 R ] /ToUnicode 228 0 R >> +237 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 244 0 R ] /ToUnicode 243 0 R >> endobj -229 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 226 0 R /W 225 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +244 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 241 0 R /W 240 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -230 0 obj +245 0 obj [ 1013 [ 569 ] 1404 [ 620 ] 2981 [ 407 ] 4558 [ 668 ] ] endobj -232 0 obj +247 0 obj << /Subtype /CIDFontType0C /Length 1102 >> [BINARY STREAM] endobj -231 0 obj -<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 232 0 R >> +246 0 obj +<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 247 0 R >> endobj -233 0 obj +248 0 obj << /Length 772 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1336,90 +1393,23 @@ end %%EOF endstream endobj -221 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 234 0 R ] /ToUnicode 233 0 R >> -endobj -234 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 231 0 R /W 230 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> -endobj -235 0 obj -[ 49 [ 681 444 ] 55 [ 306 ] 59 [ 500 ] 66 [ 278 ] 72 [ 278 ] 77 [ 556 ] 82 [ 500 ] 85 [ 389 389 ] 88 [ 278 ] 98 [ 394 ] 103 [ 333 ] 105 [ 389 500 500 ] ] -endobj -237 0 obj -<< /Subtype /CIDFontType0C /Length 2185 >> -[BINARY STREAM] -endobj 236 0 obj -<< /Type /FontDescriptor /FontName /JBZCCA+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 237 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 249 0 R ] /ToUnicode 248 0 R >> endobj -238 0 obj -<< /Length 903 >> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: ProcSet (CIDInit) -%%IncludeResource: ProcSet (CIDInit) -%%BeginResource: CMap (TeX-JBZCCA-LMRoman10-Regular-0) -%%Title: (TeX-JBZCCA-LMRoman10-Regular-0 TeX JBZCCA-LMRoman10-Regular 0) -%%Version: 1.000 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo -<< /Registry (TeX) -/Ordering (JBZCCA-LMRoman10-Regular) -/Supplement 0 ->> def -/CMapName /TeX-Identity-JBZCCA-LMRoman10-Regular def -/CMapType 2 def -1 begincodespacerange -<0000> -endcodespacerange -0 beginbfrange -endbfrange -16 beginbfchar -<0031> <0045> -<0032> <0065> -<0037> <0066> -<003B> <0067> -<0042> <0069> -<0048> <006C> -<004D> <006E> -<0052> <0031> -<0055> <0028> -<0056> <0029> -<0058> <002E> -<0062> <0073> -<0067> <0020> -<0069> <0074> -<006A> <0033> -<006B> <0032> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream +249 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 246 0 R /W 245 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -220 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /JBZCCA+LMRoman10-Regular /DescendantFonts [ 239 0 R ] /ToUnicode 238 0 R >> -endobj -239 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /JBZCCA+LMRoman10-Regular /FontDescriptor 236 0 R /W 235 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> -endobj -240 0 obj +250 0 obj [ 9 [ 389 389 ] 12 [ 778 ] 15 [ 278 ] 17 [ 500 500 500 500 500 500 ] 30 [ 778 ] 1296 [ 529 429 433 520 466 490 ] 1319 [ 572 ] 1790 [ 0 ] 2455 [ 663 663 ] 2503 [ 875 875 875 875 875 875 ] 2515 [ 902 ] 2615 [ 778 ] 2619 [ 778 ] 3074 [ 1444 ] 3077 [ 833 ] 4474 [ 570 ] ] endobj -242 0 obj +252 0 obj << /Subtype /CIDFontType0C /Length 4088 >> [BINARY STREAM] endobj -241 0 obj -<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 242 0 R >> +251 0 obj +<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 252 0 R >> endobj -243 0 obj +253 0 obj << /Length 1203 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1487,272 +1477,356 @@ end %%EOF endstream endobj -219 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 244 0 R ] /ToUnicode 243 0 R >> +235 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 254 0 R ] /ToUnicode 253 0 R >> endobj -244 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 241 0 R /W 240 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +254 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 251 0 R /W 250 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -223 0 obj -<< /Type /Pages /Count 1 /Kids [ 217 0 R ] >> +255 0 obj +[ 49 [ 681 444 ] 55 [ 306 ] 59 [ 500 ] 63 [ 556 ] 66 [ 278 ] 72 [ 278 ] 77 [ 556 ] 81 [ 500 500 ] 85 [ 389 389 ] 88 [ 278 ] 98 [ 394 ] 103 [ 333 ] 105 [ 389 500 500 ] ] endobj -245 0 obj -<< /Type /Catalog /Pages 223 0 R /MarkInfo 224 0 R/Lang (en-US)/StructTreeRoot 5 0 R >> +257 0 obj +<< /Subtype /CIDFontType0C /Length 2411 >> +[BINARY STREAM] endobj -246 0 obj +256 0 obj +<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 257 0 R >> +endobj +258 0 obj +<< /Length 931 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-RYKTJL-LMRoman10-Regular-0) +%%Title: (TeX-RYKTJL-LMRoman10-Regular-0 TeX RYKTJL-LMRoman10-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (RYKTJL-LMRoman10-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-RYKTJL-LMRoman10-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +18 beginbfchar +<0031> <0045> +<0032> <0065> +<0037> <0066> +<003B> <0067> +<003F> <0068> +<0042> <0069> +<0048> <006C> +<004D> <006E> +<0051> <006F> +<0052> <0031> +<0055> <0028> +<0056> <0029> +<0058> <002E> +<0062> <0073> +<0067> <0020> +<0069> <0074> +<006A> <0033> +<006B> <0032> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj +234 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 259 0 R ] /ToUnicode 258 0 R >> +endobj +259 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 256 0 R /W 255 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +238 0 obj +<< /Type /Pages /Count 1 /Kids [ 232 0 R ] >> +endobj +260 0 obj +<< /Type /Catalog /Pages 238 0 R /MarkInfo 239 0 R/Lang (en-US)/StructTreeRoot 5 0 R >> +endobj +261 0 obj << /Producer (LuaTeX-1.13.2) /Creator (TeX) /CreationDate (D:20160520110000+02'00') /ModDate (D:20160520110000+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.13.2 (TeX Live 2021)) >> endobj xref -0 247 +0 262 0000000002 65535 f -0000015555 00000 n +0000015844 00000 n 0000000003 00000 f 0000000004 00000 f 0000000010 00000 f -0000034484 00000 n -0000015639 00000 n -0000016276 00000 n -0000016604 00000 n -0000016298 00000 n +0000036238 00000 n +0000015928 00000 n +0000016591 00000 n +0000016919 00000 n +0000016613 00000 n 0000000012 00000 f -0000016366 00000 n +0000016681 00000 n 0000000014 00000 f -0000016436 00000 n +0000016751 00000 n 0000000016 00000 f -0000016517 00000 n +0000016832 00000 n 0000000000 00000 f -0000016651 00000 n -0000001840 00000 n -0000016769 00000 n -0000016881 00000 n -0000016962 00000 n -0000017071 00000 n -0000017152 00000 n -0000017261 00000 n -0000017342 00000 n -0000017451 00000 n -0000017532 00000 n -0000017641 00000 n -0000017722 00000 n -0000017831 00000 n -0000017912 00000 n -0000018021 00000 n -0000018102 00000 n -0000018211 00000 n -0000018292 00000 n -0000018401 00000 n -0000018482 00000 n -0000018591 00000 n -0000018672 00000 n -0000018782 00000 n -0000018873 00000 n +0000016966 00000 n +0000017092 00000 n +0000001940 00000 n +0000017200 00000 n +0000017296 00000 n +0000017377 00000 n +0000017486 00000 n +0000017567 00000 n +0000017676 00000 n +0000017757 00000 n +0000017866 00000 n +0000017947 00000 n +0000018056 00000 n +0000018137 00000 n +0000018246 00000 n +0000018327 00000 n +0000018436 00000 n +0000018517 00000 n +0000018626 00000 n +0000018707 00000 n +0000018816 00000 n +0000018897 00000 n +0000019007 00000 n +0000019088 00000 n +0000019198 00000 n +0000019274 00000 n +0000019356 00000 n 0000000020 00000 n -0000018958 00000 n -0000000074 00000 n -0000019039 00000 n -0000019136 00000 n -0000019246 00000 n -0000000129 00000 n -0000019367 00000 n -0000019477 00000 n -0000019558 00000 n -0000019668 00000 n -0000019759 00000 n -0000019844 00000 n -0000019925 00000 n -0000000200 00000 n -0000020034 00000 n -0000020146 00000 n -0000000254 00000 n -0000020289 00000 n -0000000341 00000 n -0000020374 00000 n -0000000396 00000 n -0000020470 00000 n -0000020570 00000 n -0000020667 00000 n -0000020764 00000 n -0000020861 00000 n -0000020946 00000 n -0000021090 00000 n -0000021211 00000 n -0000021309 00000 n -0000021453 00000 n -0000021549 00000 n -0000021642 00000 n -0000021732 00000 n -0000000468 00000 n -0000021824 00000 n -0000021907 00000 n -0000021997 00000 n -0000022089 00000 n -0000022162 00000 n -0000000525 00000 n -0000000579 00000 n -0000002907 00000 n -0000022247 00000 n -0000022343 00000 n -0000022460 00000 n -0000022570 00000 n -0000022691 00000 n -0000022784 00000 n -0000022889 00000 n -0000002018 00000 n -0000023010 00000 n -0000023120 00000 n -0000002083 00000 n -0000023241 00000 n -0000023324 00000 n -0000023440 00000 n -0000023533 00000 n -0000023644 00000 n -0000023755 00000 n -0000023877 00000 n -0000023988 00000 n -0000024099 00000 n -0000024210 00000 n -0000024304 00000 n -0000024416 00000 n -0000024528 00000 n -0000002154 00000 n -0000002214 00000 n -0000003776 00000 n -0000024651 00000 n -0000024750 00000 n -0000024872 00000 n -0000024969 00000 n -0000003087 00000 n -0000025093 00000 n -0000025205 00000 n -0000025302 00000 n -0000025414 00000 n -0000025486 00000 n -0000025582 00000 n -0000025694 00000 n -0000003173 00000 n -0000025841 00000 n -0000025936 00000 n -0000026048 00000 n -0000003228 00000 n -0000003288 00000 n -0000005765 00000 n -0000026172 00000 n -0000026271 00000 n -0000026373 00000 n -0000026485 00000 n -0000026597 00000 n -0000026709 00000 n -0000026827 00000 n -0000026910 00000 n -0000027033 00000 n -0000027145 00000 n -0000027257 00000 n -0000027369 00000 n -0000027453 00000 n -0000027548 00000 n -0000027660 00000 n -0000027755 00000 n -0000027879 00000 n -0000027991 00000 n -0000028101 00000 n -0000028184 00000 n -0000003957 00000 n -0000028308 00000 n -0000028432 00000 n -0000028544 00000 n -0000028654 00000 n -0000004023 00000 n -0000028801 00000 n -0000028913 00000 n -0000029036 00000 n -0000029148 00000 n -0000029258 00000 n -0000029341 00000 n -0000029464 00000 n -0000029576 00000 n -0000029723 00000 n -0000029807 00000 n -0000029890 00000 n -0000029974 00000 n -0000030057 00000 n -0000030141 00000 n -0000030253 00000 n -0000030337 00000 n -0000030420 00000 n -0000030504 00000 n -0000030587 00000 n -0000030671 00000 n -0000030754 00000 n -0000030850 00000 n -0000004147 00000 n -0000030967 00000 n -0000031092 00000 n -0000031176 00000 n -0000031251 00000 n -0000031376 00000 n -0000031460 00000 n -0000031535 00000 n -0000031660 00000 n -0000031744 00000 n -0000004265 00000 n -0000007077 00000 n -0000031819 00000 n -0000031918 00000 n -0000032109 00000 n -0000032212 00000 n -0000032336 00000 n -0000032460 00000 n -0000032584 00000 n -0000005946 00000 n -0000032708 00000 n -0000032820 00000 n -0000032944 00000 n -0000033067 00000 n -0000033170 00000 n -0000033294 00000 n -0000033418 00000 n -0000033542 00000 n -0000033666 00000 n -0000033778 00000 n -0000033901 00000 n -0000034013 00000 n -0000034125 00000 n -0000034249 00000 n -0000034372 00000 n -0000006022 00000 n -0000015451 00000 n -0000015305 00000 n -0000007258 00000 n -0000049263 00000 n -0000042951 00000 n -0000038951 00000 n -0000036269 00000 n -0000049635 00000 n -0000015602 00000 n -0000034589 00000 n -0000035298 00000 n -0000034621 00000 n -0000035521 00000 n -0000036425 00000 n -0000036627 00000 n -0000037887 00000 n -0000036700 00000 n -0000038118 00000 n -0000039114 00000 n -0000039323 00000 n -0000041764 00000 n -0000039494 00000 n -0000041987 00000 n -0000043108 00000 n -0000043311 00000 n -0000047769 00000 n -0000043596 00000 n -0000047999 00000 n -0000049426 00000 n -0000049699 00000 n -0000049804 00000 n +0000019467 00000 n +0000019545 00000 n +0000000093 00000 n +0000019634 00000 n +0000019712 00000 n +0000019834 00000 n +0000019932 00000 n +0000020042 00000 n +0000020163 00000 n +0000020273 00000 n +0000020349 00000 n +0000020447 00000 n +0000020525 00000 n +0000020614 00000 n +0000020692 00000 n +0000020768 00000 n +0000020866 00000 n +0000020944 00000 n +0000021033 00000 n +0000021111 00000 n +0000021201 00000 n +0000000164 00000 n +0000021282 00000 n +0000021363 00000 n +0000021473 00000 n +0000021544 00000 n +0000021657 00000 n +0000021728 00000 n +0000021799 00000 n +0000021889 00000 n +0000021970 00000 n +0000000219 00000 n +0000022079 00000 n +0000022191 00000 n +0000000273 00000 n +0000022334 00000 n +0000000360 00000 n +0000022419 00000 n +0000000415 00000 n +0000022515 00000 n +0000022615 00000 n +0000022712 00000 n +0000022809 00000 n +0000022906 00000 n +0000022991 00000 n +0000023135 00000 n +0000023256 00000 n +0000023354 00000 n +0000023498 00000 n +0000023594 00000 n +0000023687 00000 n +0000023777 00000 n +0000023867 00000 n +0000000487 00000 n +0000000541 00000 n +0000003009 00000 n +0000023952 00000 n +0000024051 00000 n +0000024173 00000 n +0000024285 00000 n +0000024408 00000 n +0000024504 00000 n +0000024615 00000 n +0000002118 00000 n +0000024739 00000 n +0000024851 00000 n +0000002184 00000 n +0000024975 00000 n +0000025061 00000 n +0000025180 00000 n +0000025275 00000 n +0000025387 00000 n +0000025499 00000 n +0000025623 00000 n +0000025735 00000 n +0000025847 00000 n +0000025959 00000 n +0000026054 00000 n +0000026166 00000 n +0000026278 00000 n +0000002256 00000 n +0000002316 00000 n +0000003879 00000 n +0000026402 00000 n +0000026501 00000 n +0000026623 00000 n +0000026720 00000 n +0000003190 00000 n +0000026844 00000 n +0000026956 00000 n +0000027053 00000 n +0000027165 00000 n +0000027237 00000 n +0000027333 00000 n +0000027445 00000 n +0000003276 00000 n +0000027592 00000 n +0000027687 00000 n +0000027799 00000 n +0000003331 00000 n +0000003391 00000 n +0000005868 00000 n +0000027923 00000 n +0000028022 00000 n +0000028124 00000 n +0000028236 00000 n +0000028348 00000 n +0000028460 00000 n +0000028578 00000 n +0000028661 00000 n +0000028784 00000 n +0000028896 00000 n +0000029008 00000 n +0000029120 00000 n +0000029204 00000 n +0000029299 00000 n +0000029411 00000 n +0000029506 00000 n +0000029630 00000 n +0000029742 00000 n +0000029852 00000 n +0000029935 00000 n +0000004060 00000 n +0000030059 00000 n +0000030183 00000 n +0000030295 00000 n +0000030405 00000 n +0000004126 00000 n +0000030552 00000 n +0000030664 00000 n +0000030788 00000 n +0000030900 00000 n +0000031010 00000 n +0000031093 00000 n +0000031216 00000 n +0000031328 00000 n +0000031475 00000 n +0000031559 00000 n +0000031642 00000 n +0000031726 00000 n +0000031809 00000 n +0000031893 00000 n +0000032005 00000 n +0000032089 00000 n +0000032172 00000 n +0000032256 00000 n +0000032339 00000 n +0000032423 00000 n +0000032506 00000 n +0000032602 00000 n +0000004250 00000 n +0000032719 00000 n +0000032844 00000 n +0000032928 00000 n +0000033003 00000 n +0000033128 00000 n +0000033212 00000 n +0000033287 00000 n +0000033412 00000 n +0000033496 00000 n +0000004368 00000 n +0000007180 00000 n +0000033571 00000 n +0000033670 00000 n +0000033861 00000 n +0000033964 00000 n +0000034088 00000 n +0000034212 00000 n +0000034336 00000 n +0000006049 00000 n +0000034460 00000 n +0000034572 00000 n +0000034696 00000 n +0000034820 00000 n +0000034923 00000 n +0000035047 00000 n +0000035171 00000 n +0000035295 00000 n +0000035419 00000 n +0000035531 00000 n +0000035655 00000 n +0000035767 00000 n +0000035879 00000 n +0000036003 00000 n +0000036126 00000 n +0000006125 00000 n +0000015740 00000 n +0000015594 00000 n +0000007361 00000 n +0000051298 00000 n +0000047029 00000 n +0000040705 00000 n +0000038023 00000 n +0000051658 00000 n +0000015891 00000 n +0000036343 00000 n +0000037052 00000 n +0000036375 00000 n +0000037275 00000 n +0000038179 00000 n +0000038381 00000 n +0000039641 00000 n +0000038454 00000 n +0000039872 00000 n +0000040868 00000 n +0000041077 00000 n +0000045535 00000 n +0000041362 00000 n +0000045765 00000 n +0000047192 00000 n +0000047401 00000 n +0000050083 00000 n +0000047587 00000 n +0000050306 00000 n +0000051455 00000 n +0000051722 00000 n +0000051827 00000 n trailer -<< /Size 247 /Root 245 0 R /Info 246 0 R /ID [ <4F23DD47C2CB1E4A823FC7CBBBCDBD14> <4F23DD47C2CB1E4A823FC7CBBBCDBD14> ] >> +<< /Size 262 /Root 260 0 R /Info 261 0 R /ID [ <4F23DD47C2CB1E4A823FC7CBBBCDBD14> <4F23DD47C2CB1E4A823FC7CBBBCDBD14> ] >> startxref -50027 +52050 %%EOF diff --git a/testfiles-lua/test_xml.mlr b/testfiles-lua/test_xml.mlr index 00e5ff8..6d2098c 100644 --- a/testfiles-lua/test_xml.mlr +++ b/testfiles-lua/test_xml.mlr @@ -1,11 +1,3 @@ - - - - - - - - ( From d6758fe9971dd453174081def1ce40729e94946e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 1 Nov 2021 07:44:18 +0100 Subject: [PATCH 087/206] Beginning of draft for algorithm description --- algorithm.tex | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 algorithm.tex diff --git a/algorithm.tex b/algorithm.tex new file mode 100644 index 0000000..eb71f74 --- /dev/null +++ b/algorithm.tex @@ -0,0 +1,103 @@ +\documentclass{article} +\begin{document} +\title{From math lists to MathML} +\subtitle{The algorithm in luamml} +\author{Marcel} +\maketitle +\section{General concepts} +In the following I assume basic familiarity with both Lua\TeX's representation of math noads and MathML. + +\subsection{Representation of XML elements} +In many places, \luamml\ passes around XML elements. Every element is represented by a Lua table. +Element \texttt 0 must always be present and is a string representing the tag name. +The positive integer elements of the table represent child elements (either strings for direct text content or nested tables for nested elements). +All string members which do not start with a colon are attributes, whose value is the result of applying \texttt{tostring} to the field value. +This implies that these values should almost always be strings, except that the value \texttt 0 (since it never needs a unit) can often be set as a number. +For example the XML document +\begin{verbatim} + + 0 + < + x + +\end{verbatim} +would be represented by the Lua table +\begin{verbatim} +{[0] = "math", block="display", + {[0] = "mn", "0"}, + {[0] = "mo", "<"}, + {[0] = "mi", mathvariant="normal", "x"} +} +\end{verbatim} + +\subsection{Expression cores} +MathML knows the concept of \enquote{embellished operators}: +\begin{blockquote} + The precise definition of an \enquote{embellished operator} is: + \begin{itemize} + \item an \tag{mo} element; + \item or one of the elements \tag{msub}, \tag{msup}, \tag{msubsup}, \tag{munder}, \tag{mover}, \tag{munderover}, \tag{mmultiscripts}, \tag{mfrac}, or \tag{semantics} (ยง 5.1 Annotation Framework), whose first argument exists and is an embellished operator; + \item or one of the elements \tag{mstyle}, \tag{mphantom}, or \tag{mpadded}, such that an mrow containing the same arguments would be an embellished operator; + \item or an \tag{maction} element whose selected sub-expression exists and is an embellished operator; + \item or an \tag{mrow} whose arguments consist (in any order) of one embellished operator and zero or more space-like elements. + \end{itemize} +\end{blockquote} +For every embellished operator, MathML calls the \tag{mo} element defining the embellished operator the \enquote{core} of the embellished operator. + +\Luamml\ makes this slightly more general: Every expression is represented by a pair of two elements: The expression and it's core. +The core is always a \tag{mo}, \tag{mi}, or \tag{mn}, \texttt{nil} or s special marker for space like elements. + +If and only if the element is a embellished operator the core is a \tag{mo} element representing the core of the embellished operator. +The core is a \tag{mi} or a \tag{mn} element if and only if the element would be an embellished operator with this core if this element where a \tag{mo} element. +The core is the special space like marker for space like elements. Otherwise the core is \texttt{nil}. + +\section{Translation of math noads} +A math lists can contain the following node types: noad, fence, fraction, radical, accent, style, choice, ins, mark, adjust, boundary, whatsit, penalty, disc, glue, and kern. The \enquote{noads} + +\subsection{Translation of kernel noads} +The math noads of this list contain nested kernel noads. So in the first step, we look into how kernel nodes are translated to math nodes. + +\subsubsection{\texttt{math_char} kernel noads} +First the family and character value in the \texttt{math_char} are used to lookup the Unicode character value of this \texttt{math_char}. +(For \textt{unicode-math}, this is usually just the character value. Legacy maths has to be remapped based on the family.) +Then there are two cases: The digits \texttt{0} to \texttt{9} are mapped to \tag{mn} elements, everything else becomes a \tag{mi} element with \texttt{mathvariant} set to \texttt{normal}. +(The \texttt{mathvariant} value might get suppressed if the character defaults to mathvariant \texttt{normal}.) +In either case, the \texttt{tex:family} attribute is set to the family number if it's not \texttt{0}. + +The core is always set to the expression itself. E.g.\ the \texttt{math_char} kernel noad \verb+\fam3 a+ would become (assuming no remapping for this family) +\begin{verbatim} +{[0] = 'mi', + mathvariant = 'normal', + ["tex:family"] = 3, + "a" +} +\end{verbatim} + +\subsection{\texttt{sub_box} kernel noads} +I am open to suggestions how to convert them properly. + +\subsection{\texttt{sub_mlist} kernel noads} +The inner list is converted as a \tag{mrow} element, with the core being the core of the \tag{mrow} element. See the rules for this later. + +\subsection{\texttt{delim} kernel noads} +If the \texttt{small_char} is zero, these get converted as space like elements of the form +\begin{verbatim} +{[0] = 'mspace', + width = '1.196pt', +} +\end{verbatim} +where 1.196 is replaced by the current value of \verb+\nulldelimiterspace+ converted to \texttt{bp}. + +Otherwise the same rules as for \texttt{math_char} apply, +except that instead of \texttt{mi} or \tag{mn} elements, +\texttt{mo} elements are generated, +\texttt{mathvariant} is never set, +\texttt{stretchy} is set to \texttt{true} if the operator is not on the list of default stretchy operators in the MathML specification +nd \texttt{lspace} and \texttt{rspace} attributes are set to zero. + +\subsection{\texttt{acc} kernel noads} +Depending on the surrounding element containing the \texttt{acc} kernel noad, it is either stretchy or not. +If it's stretchy, the same rules as for \texttt{delim} apply, except that \texttt{lspace} and \texttt{rspace} are not set. +Otherwise the \textt{stretchy} attribute is set to false if the operator is on the list of default stretchy operators. + +\end{document} From c8c32e0f4c83a9f461e37c385d2a6a975dee317a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 2 Nov 2021 02:27:20 +0100 Subject: [PATCH 088/206] Move cases patches to kernel patches --- luamml-patches-amsmath.sty | 7 -- luamml-patches-kernel.sty | 7 ++ testfiles-lua/cases.mlr | 161 +++++++++++++++++++++++++++++++++++++ testfiles-lua/cases.mlt | 43 ++++++++++ testfiles-lua/test_xml.mlt | 4 +- 5 files changed, 213 insertions(+), 9 deletions(-) create mode 100644 testfiles-lua/cases.mlr create mode 100644 testfiles-lua/cases.mlt diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index fa6ec7e..f8933c4 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -406,10 +406,3 @@ } } } - -\cs_set:Npn \env@cases { - \let \@ifnextchar \new@ifnextchar - \left \lbrace - \def \arraystretch {1.2} - \array {@{}l@{\quad \luamml_flag_ignore:}l@{}} -} diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index e03a991..457d14d 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -34,6 +34,13 @@ \__luamml_kernel_phantom:Vnn \g__luamml_kernel_phantom_int } +\cs_set:Npn \env@cases { + \let \@ifnextchar \new@ifnextchar + \left \lbrace + \def \arraystretch {1.2} + \array {@{}l@{\quad \luamml_flag_ignore:}l@{}} +} + \@ifpackageloaded {unicode-math} {} { \cs_new:Npn \__luamml_kernel_define_character:Nnn #1#2#3 { \cs_set:cpx { \cs_to_str:N #1 ~ } { diff --git a/testfiles-lua/cases.mlr b/testfiles-lua/cases.mlr new file mode 100644 index 0000000..78aa953 --- /dev/null +++ b/testfiles-lua/cases.mlr @@ -0,0 +1,161 @@ + + + + + + ๐‘Ž + = + ๐‘ + + + + + + + + ( + + + + + + 1 + + + 0 + + + 0 + + + + + 0 + + + 1 + + + 0 + + + + + 0 + + + 0 + + + 1 + + + + + + ) + + = + + { + + + + + 1 + + + if  + + ๐‘Ž + = + ๐‘ + + + + + + 2 + + + else + + + + + + + + + ๐‘ฅ + = + + + โˆ’ + ๐‘ + ยฑ + + + + ๐‘ + 2 + + โˆ’ + 4 + ๐‘Ž + ๐‘ + + + + + 2 + ๐‘Ž + + + . + + + ๐‘ + + + + โˆ‘ + ๐‘Ž + + + ๐‘ + _ + + + ๐‘ + _ + + + ๐‘ + โ€ฒ + + + + + s + i + n + + ( + ๐‘ฅ + ) + โˆ’ + + s + i + n + + ( + ๐‘ฅ + + + 2 + ๐œ‹ + ) + = + 0 + diff --git a/testfiles-lua/cases.mlt b/testfiles-lua/cases.mlt new file mode 100644 index 0000000..a0bfb14 --- /dev/null +++ b/testfiles-lua/cases.mlt @@ -0,0 +1,43 @@ +\RequirePackage{pdfmanagement-testphase} +\DeclareDocumentMetadata{ + uncompress, + pdfversion = 2.0, +} +\documentclass{article} +\usepackage[l3build]{luamml-demo} +\usepackage{tagpdf} +\tagpdfsetup{ + activate-all, + interwordspace=true, +} + +\begin{document} +\tagstructbegin{tag=Document} +\LuaMMLTagAF{} { +\[ + \left(\begin{matrix} + 1 & 0 & 0 \\ + 0 & 1 & 0 \\ + 0 & 0 & 1 + \end{matrix}\right) + = + \begin{cases} + 1 & \mbox{if $a=b$}\\ + 2 & \mbox{else} + \end{cases} +\] +} +\LuaMMLTagAF{} { +\[ + x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}. +\] +} +\LuaMMLTagAF{} { +\[ + \sum_a\underline c\dot bc' +\] +} + +Es gilt \LuaMMLTagAF{}{$\sin(x)-\sin(x+2\pi)=0$}. +\tagstructend +\end{document} diff --git a/testfiles-lua/test_xml.mlt b/testfiles-lua/test_xml.mlt index a732ade..3c72240 100644 --- a/testfiles-lua/test_xml.mlt +++ b/testfiles-lua/test_xml.mlt @@ -24,8 +24,8 @@ \end{pmatrix} = \begin{cases} - 1 & $if $a=b\\ - 2 & $else$ + 1 & \text{if $a=b$}\\ + 2 & \text{else} \end{cases} \] } From bdbeb16c53dbb7268bccc794982683499296327f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 16 Dec 2021 18:18:31 +0100 Subject: [PATCH 089/206] Adapt to tagpdf's push/pop mc commands --- luamml-demo.sty | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/luamml-demo.sty b/luamml-demo.sty index eb4ee9c..5e2d8df 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -49,11 +49,12 @@ \cs_generate_variant:Nn \pdffile_filespec:nnn {ene} \int_new:N \g__luamml_demo_af_int \cs_new_protected:Npn \LuaMMLTagAF #1#2 { + \tag_mc_end_push: \int_gincr:N \g__luamml_demo_af_int \exp_args:Ne \pdf_object_new:nn{__luamml_demo_\int_use:N \g__luamml_demo_af_int}{dict} - \exp_args:Ne \tagstructbegin{tag=Formula,AF=__luamml_demo_\int_use:N \g__luamml_demo_af_int,#1} + \exp_args:Ne \tag_struct_begin:n{tag=Formula,AF=__luamml_demo_\int_use:N \g__luamml_demo_af_int,#1} \bool_if:NF \l__luamml_demo_structelem_bool { - \tagmcbegin{tag=Formula} + \tag_mc_begin:n{tag=Formula} } #2 \group_begin: @@ -64,9 +65,10 @@ { \luamml_get_last_mathml_stream:e{}\c_space_tl 0~R} \group_end: \bool_if:NF \l__luamml_demo_structelem_bool { - \tagmcend + \tag_mc_end: } - \tagstructend + \tag_struct_end: + \tag_mc_begin_pop:n{} } \NewDocumentCommand\AnnotateFormula{ o m m }{% From d2bb7a9457f142953585254990c17ee62eee866b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 17 Dec 2021 08:37:21 +0100 Subject: [PATCH 090/206] Reference demo package in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b14b51..d139829 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Run `l3build install` to install `luamml` into your local `texmf` tree. ## Demo Run `lualatex test_tex` to see all equations from [our example file](./test_tex.tex) converted into MathML. -To test it on your own files, add `\usepackage{luamml}` and `\tracingmathml=2` to your preamble. +To test it on your own files, add `\usepackage[tracing]{luamml-demo}` (to print MathML to the terminal) or `\usepackage[files]{luamml-demo}` to generate separate files with MathML output. Also see a [`tagpdf` experiment using this to tag PDF formulas](https://github.com/u-fischer/tagpdf/blob/develop/experiments/exp-mathml-lua.tex). If you are very brave you can also try running `pdflatex test_pdf` and afterwards run `./pdfmml.lua test_pdf.lua` to get pdflatex formulas converted. From f5be988925fee5dfb896dc045848a1f56bb70f19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 4 Dec 2022 07:33:13 +0100 Subject: [PATCH 091/206] Adapt to L3PL naming change of \use(_i):n --- luamml-patches-amstext.sty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luamml-patches-amstext.sty b/luamml-patches-amstext.sty index d4d15ca..2850257 100644 --- a/luamml-patches-amstext.sty +++ b/luamml-patches-amstext.sty @@ -18,7 +18,7 @@ struct = "__luamml_amsmath_text_ \int_use:N \g__luamml_amsmath_text_struct_int" } } { - \use_i:n + \use:n } { \hbox { From cb2c48aa8dd5a91751fa890262477b4ad0da084e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 4 Dec 2022 07:51:36 +0100 Subject: [PATCH 092/206] Move {cases} patch to amsmath patches since it patches the amsmath definition --- luamml-patches-amsmath.sty | 9 +++++++++ luamml-patches-kernel.sty | 7 ------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index f8933c4..733b71b 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -399,6 +399,15 @@ } } +% {cases} is defined by the kernel, but we patch the overwritten version by amsmath. +\cs_set:Npn \env@cases { + \let \@ifnextchar \new@ifnextchar + \left \lbrace + \def \arraystretch {1.2} + \array {@{}l@{\quad \luamml_flag_ignore:}l@{}} +} + + \cs_set:Npn \bBigg@ #1 #2 { { \ensuremath { diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index 457d14d..e03a991 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -34,13 +34,6 @@ \__luamml_kernel_phantom:Vnn \g__luamml_kernel_phantom_int } -\cs_set:Npn \env@cases { - \let \@ifnextchar \new@ifnextchar - \left \lbrace - \def \arraystretch {1.2} - \array {@{}l@{\quad \luamml_flag_ignore:}l@{}} -} - \@ifpackageloaded {unicode-math} {} { \cs_new:Npn \__luamml_kernel_define_character:Nnn #1#2#3 { \cs_set:cpx { \cs_to_str:N #1 ~ } { From a2fb445894683ca005a2812fec9d485d7a700e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 4 Dec 2022 08:33:31 +0100 Subject: [PATCH 093/206] Some test updates --- testfiles-lua/cases.mlr | 8 - testfiles-lua/test_struct.tpf | 1298 +++++++++++++++++++-------------- testfiles-lua/test_xml.mlr | 28 +- 3 files changed, 779 insertions(+), 555 deletions(-) diff --git a/testfiles-lua/cases.mlr b/testfiles-lua/cases.mlr index 78aa953..286d847 100644 --- a/testfiles-lua/cases.mlr +++ b/testfiles-lua/cases.mlr @@ -1,16 +1,8 @@ - - - - ๐‘Ž = ๐‘ - - - - ( diff --git a/testfiles-lua/test_struct.tpf b/testfiles-lua/test_struct.tpf index 6da1844..ef8484e 100644 --- a/testfiles-lua/test_struct.tpf +++ b/testfiles-lua/test_struct.tpf @@ -104,609 +104,816 @@ endobj 206 0 obj << /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -233 0 obj -<< /Length 8172 >> +231 0 obj +<< /Type /Metadata /Subtype /XML /Length 10291 >> +stream + + + + + + + + PDF/A Identification Schema + pdfaid + http://www.aiim.org/pdfa/ns/id/ + + + + year + Integer + internal + Year of standard + + + + + + PDF/UA Universal Accessibility Schema + pdfuaid + http://www.aiim.org/pdfua/ns/id/ + + + + part + Integer + internal + Part of ISO 14289 standard + + + + + + PDF/X ID Schema + pdfxid + http://www.npes.org/pdfx/ns/id/ + + + + GTS_PDFXVersion + Text + internal + ID of PDF/X standard + + + + + + PRISM Basic Metadata + prism + http://prismstandard.org/namespaces/basic/3.0/ + + + + complianceProfile + Text + internal + PRISM specification compliance profile to which this document adheres + + + publicationName + Text + external + Publicationname + + + aggregationType + Text + external + Publicationtype + + + bookEdition + Text + external + Edition of the book in which the document was published + + + volume + Text + external + Publication volume number + + + number + Text + external + Publication issue number within a volume + + + pageRange + Text + external + Page range for the document within the print version of its publication + + + issn + Text + external + ISSN for the printed publication in which the document was published + + + eIssn + Text + external + ISSN for the electronic publication in which the document was published + + + isbn + Text + external + ISBNforthepublicationinwhichthedocumentwaspublished + + + doi + Text + external + Digital Object Identifier for the document + + + url + URL + external + URL at which the document can be found + + + byteCount + Integer + internal + Approximate file size in octets + + + pageCount + Integer + internal + Number of pages in the print version of the document + + + subtitle + Text + external + Document'ssubtitle + + + + + + + luahbtex-1.15.1 + 2.0 + + + Text + + + + + en-US + + + + + 2022-12-04T07:49:10+01:00 + + + application/pdf + test_struct.tex + LaTeX + 2022-12-04T07:49:10+01:00 + 2022-12-04T07:49:10+01:00 + 2022-12-04T07:49:10+01:00 + uuid:0629f6ef-2113-4b62-83f8-5725311a8337 + uuid:30145665-c0d5-49c3-8864-4194d811e742 + three + 1 + + + + +endstream +endobj +234 0 obj +<< /Length 8175 >> stream /opacity1 gs /Artifact BMC EMC /P<> BDC BT -/F23 9.96264 Tf -1 0 0 1 148.712 707.125 Tm [<003F0032004800480051>]TJ +/F15 9.96264 Tf +1 0 0 1 148.712 657.235 Tm [<003F0032004800480051>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 244.284 677.502 Tm [<09C9>]TJ -1 0 0 1 244.284 673.76 Tm [<09C8>]TJ -1 0 0 1 244.284 660.086 Tm [<09C7>]TJ +/F20 9.96264 Tf +1 0 0 1 244.284 627.612 Tm [<09C9>]TJ +1 0 0 1 244.284 623.87 Tm [<09C8>]TJ +1 0 0 1 244.284 610.196 Tm [<09C7>]TJ ET EMC /Artifact BMC EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 253.001 685.805 Tm [<0012>]TJ +/F20 9.96264 Tf +1 0 0 1 253.001 635.915 Tm [<0012>]TJ ET EMC /Artifact BMC EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 267.945 685.805 Tm [<0011>]TJ +/F20 9.96264 Tf +1 0 0 1 267.945 635.915 Tm [<0011>]TJ ET EMC /Artifact BMC EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 282.889 685.805 Tm [<0011>]TJ +/F20 9.96264 Tf +1 0 0 1 282.889 635.915 Tm [<0011>]TJ ET EMC /Artifact BMC EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 253.001 673.85 Tm [<0011>]TJ +/F20 9.96264 Tf +1 0 0 1 253.001 623.96 Tm [<0011>]TJ ET EMC /Artifact BMC EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 267.945 673.85 Tm [<0012>]TJ +/F20 9.96264 Tf +1 0 0 1 267.945 623.96 Tm [<0012>]TJ ET EMC /Artifact BMC EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 282.889 673.85 Tm [<0011>]TJ +/F20 9.96264 Tf +1 0 0 1 282.889 623.96 Tm [<0011>]TJ ET EMC /Artifact BMC EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 253.001 661.895 Tm [<0011>]TJ +/F20 9.96264 Tf +1 0 0 1 253.001 612.005 Tm [<0011>]TJ ET EMC /Artifact BMC EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 267.945 661.895 Tm [<0011>]TJ +/F20 9.96264 Tf +1 0 0 1 267.945 612.005 Tm [<0011>]TJ ET EMC /Artifact BMC EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 282.889 661.895 Tm [<0012>]TJ +/F20 9.96264 Tf +1 0 0 1 282.889 612.005 Tm [<0012>]TJ ET EMC /Artifact BMC EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 287.871 677.502 Tm [<09CC>]TJ -1 0 0 1 287.871 673.76 Tm [<09CB>]TJ -1 0 0 1 287.871 660.086 Tm [<09CA>]TJ +/F20 9.96264 Tf +1 0 0 1 287.871 627.612 Tm [<09CC>]TJ +1 0 0 1 287.871 623.87 Tm [<09CB>]TJ +1 0 0 1 287.871 610.196 Tm [<09CA>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 299.355 673.751 Tm [<001E>]TJ +/F20 9.96264 Tf +1 0 0 1 299.355 623.861 Tm [<001E>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 309.873 673.75 Tm [<09D3>]TJ +/F20 9.96264 Tf +1 0 0 1 309.873 623.861 Tm [<09D3>]TJ ET EMC /Artifact BMC EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 318.859 680.545 Tm [<0012>]TJ +/F20 9.96264 Tf +1 0 0 1 318.859 630.655 Tm [<0012>]TJ ET EMC /Artifact BMC EMC /mtext<> BDC BT -/F23 9.96264 Tf -1 0 0 1 333.803 680.545 Tm [<004200370067>]TJ +/F15 9.96264 Tf +1 0 0 1 333.803 630.655 Tm [<004200370067>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 342.939 680.545 Tm [<0510>]TJ +/F20 9.96264 Tf +1 0 0 1 342.939 630.655 Tm [<0510>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 350.976 680.545 Tm [<001E>]TJ +/F20 9.96264 Tf +1 0 0 1 350.976 630.655 Tm [<001E>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 361.494 680.545 Tm [<0511>]TJ +/F20 9.96264 Tf +1 0 0 1 361.494 630.655 Tm [<0511>]TJ ET EMC /Artifact BMC EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 318.859 666.199 Tm [<0013>]TJ +/F20 9.96264 Tf +1 0 0 1 318.859 616.309 Tm [<0013>]TJ ET EMC /Artifact BMC EMC /mtext<> BDC BT -/F23 9.96264 Tf -1 0 0 1 333.803 666.199 Tm [<0032004800620032>]TJ +/F15 9.96264 Tf +1 0 0 1 333.803 616.309 Tm [<0032004800620032>]TJ ET EMC /Artifact BMC EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 259.389 634.066 Tm [<0527>]TJ +/F20 9.96264 Tf +1 0 0 1 259.389 584.176 Tm [<0527>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 267.855 634.066 Tm [<001E>]TJ +/F20 9.96264 Tf +1 0 0 1 267.855 584.176 Tm [<001E>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 279.569 640.81 Tm [<0A37>]TJ +/F20 9.96264 Tf +1 0 0 1 279.569 590.92 Tm [<0A37>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 287.32 640.81 Tm [<0511>]TJ +/F20 9.96264 Tf +1 0 0 1 287.32 590.92 Tm [<0511>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 293.947 640.81 Tm [<0A3B>]TJ +/F20 9.96264 Tf +1 0 0 1 293.947 590.92 Tm [<0A3B>]TJ ET EMC /Artifact BMC BT -/F28 9.96264 Tf -1 0 0 1 303.911 649.541 Tm [<0C05>]TJ +/F20 9.96264 Tf +1 0 0 1 303.911 599.651 Tm [<0C05>]TJ ET q -1 0 0 1 312.21 649.74 cm +1 0 0 1 312.21 599.851 cm [] 0 d 0 J 0.398 w 0 0 m 35.683 0 l S Q EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 312.21 640.81 Tm [<0511>]TJ +/F20 9.96264 Tf +1 0 0 1 312.21 590.92 Tm [<0511>]TJ ET EMC /mn<> BDC BT -/F29 6.97385 Tf -1 0 0 1 316.624 643.689 Tm [<03F5>]TJ +/F21 6.97385 Tf +1 0 0 1 316.624 593.799 Tm [<03F5>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 323.363 640.81 Tm [<0A37>]TJ +/F20 9.96264 Tf +1 0 0 1 323.363 590.92 Tm [<0A37>]TJ ET EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 333.328 640.81 Tm [<0015>]TJ +/F20 9.96264 Tf +1 0 0 1 333.328 590.92 Tm [<0015>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 338.309 640.81 Tm [<0510>]TJ +/F20 9.96264 Tf +1 0 0 1 338.309 590.92 Tm [<0510>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 343.579 640.81 Tm [<0512>]TJ +/F20 9.96264 Tf +1 0 0 1 343.579 590.92 Tm [<0512>]TJ ET EMC /Artifact BMC q -1 0 0 1 279.569 636.556 cm +1 0 0 1 279.569 586.667 cm [] 0 d 0 J 0.398 w 0 0 m 68.325 0 l S Q EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 308.605 627.232 Tm [<0013>]TJ +/F20 9.96264 Tf +1 0 0 1 308.605 577.343 Tm [<0013>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 313.587 627.232 Tm [<0510>]TJ +/F20 9.96264 Tf +1 0 0 1 313.587 577.343 Tm [<0510>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 349.089 634.066 Tm [<000F>]TJ +/F20 9.96264 Tf +1 0 0 1 349.089 584.176 Tm [<000F>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 289.258 604.178 Tm [<0C02>]TJ +/F20 9.96264 Tf +1 0 0 1 289.258 554.288 Tm [<0C02>]TJ ET EMC /mi<> BDC BT -/F29 6.97385 Tf -1 0 0 1 294.289 593.718 Tm [<057C>]TJ +/F21 6.97385 Tf +1 0 0 1 294.289 543.828 Tm [<057C>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 305.304 604.178 Tm [<0512>]TJ +/F20 9.96264 Tf +1 0 0 1 305.304 554.288 Tm [<0512>]TJ ET EMC /Artifact BMC q -1 0 0 1 305.304 602.674 cm +1 0 0 1 305.304 552.784 cm [] 0 d 0 J 0.398 w 0 0 m 4.314 0 l S Q EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 313.902 606.609 Tm [<06FE>]TJ +/F20 9.96264 Tf +1 0 0 1 313.902 556.719 Tm [<06FE>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 309.618 604.178 Tm [<0511>]TJ +/F20 9.96264 Tf +1 0 0 1 309.618 554.288 Tm [<0511>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 314.031 604.178 Tm [<0512>]TJ +/F20 9.96264 Tf +1 0 0 1 314.031 554.288 Tm [<0512>]TJ ET EMC /mi<> BDC BT -/F29 6.97385 Tf -1 0 0 1 318.594 607.794 Tm [<0BA5>]TJ +/F21 6.97385 Tf +1 0 0 1 318.594 557.904 Tm [<0BA5>]TJ ET EMC /Artifact BMC EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 231.386 564.328 Tm [<0510>]TJ +/F20 9.96264 Tf +1 0 0 1 231.386 514.438 Tm [<0510>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 236.656 564.328 Tm [<0511>]TJ +/F20 9.96264 Tf +1 0 0 1 236.656 514.438 Tm [<0511>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 241.07 564.328 Tm [<0512>]TJ +/F20 9.96264 Tf +1 0 0 1 241.07 514.438 Tm [<0512>]TJ ET EMC /Artifact BMC EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 248.151 564.328 Tm [<001E>]TJ +/F20 9.96264 Tf +1 0 0 1 248.151 514.438 Tm [<001E>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 258.669 564.328 Tm [<0513>]TJ +/F20 9.96264 Tf +1 0 0 1 258.669 514.438 Tm [<0513>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 264.088 564.328 Tm [<0514>]TJ +/F20 9.96264 Tf +1 0 0 1 264.088 514.438 Tm [<0514>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 268.731 564.328 Tm [<0515>]TJ +/F20 9.96264 Tf +1 0 0 1 268.731 514.438 Tm [<0515>]TJ ET EMC /Artifact BMC EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 356.482 564.328 Tm [<0514>]TJ +/F20 9.96264 Tf +1 0 0 1 356.482 514.438 Tm [<0514>]TJ ET EMC /mi<> BDC BT -/F40 6.97385 Tf -1 0 0 1 361.124 567.944 Tm [<0042>]TJ +/F32 6.97385 Tf +1 0 0 1 361.124 518.054 Tm [<0042>]TJ ET EMC /mi<> BDC BT -/F29 6.97385 Tf -1 0 0 1 363.377 567.944 Tm [<11CE>]TJ +/F21 6.97385 Tf +1 0 0 1 363.377 518.054 Tm [<11CE>]TJ ET EMC /Artifact BMC EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 371.36 564.328 Tm [<001E>]TJ +/F20 9.96264 Tf +1 0 0 1 371.36 514.438 Tm [<001E>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 381.878 564.328 Tm [<0A37>]TJ +/F20 9.96264 Tf +1 0 0 1 381.878 514.438 Tm [<0A37>]TJ ET EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 389.629 564.328 Tm [<0012>]TJ +/F20 9.96264 Tf +1 0 0 1 389.629 514.438 Tm [<0012>]TJ ET EMC /Artifact BMC BT -/F23 9.96264 Tf -1 0 0 1 464.747 564.328 Tm [<005500520056>]TJ +/F15 9.96264 Tf +1 0 0 1 464.747 514.438 Tm [<005500520056>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 216.637 543.844 Tm [<0997>]TJ +/F20 9.96264 Tf +1 0 0 1 216.637 493.955 Tm [<0997>]TJ ET EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 223.243 543.845 Tm [<0012>]TJ +/F20 9.96264 Tf +1 0 0 1 223.243 493.955 Tm [<0012>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 230.438 543.845 Tm [<000C>]TJ +/F20 9.96264 Tf +1 0 0 1 230.438 493.955 Tm [<000C>]TJ ET EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 240.402 543.845 Tm [<0013>]TJ +/F20 9.96264 Tf +1 0 0 1 240.402 493.955 Tm [<0013>]TJ ET EMC /Artifact BMC EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 248.151 543.845 Tm [<001E>]TJ +/F20 9.96264 Tf +1 0 0 1 248.151 493.955 Tm [<001E>]TJ ET EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 258.669 543.845 Tm [<0014>]TJ +/F20 9.96264 Tf +1 0 0 1 258.669 493.955 Tm [<0014>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 263.65 543.844 Tm [<0998>]TJ +/F20 9.96264 Tf +1 0 0 1 263.65 493.955 Tm [<0998>]TJ ET EMC /Artifact BMC BT -/F23 9.96264 Tf -1 0 0 1 464.747 543.845 Tm [<0055006B0056>]TJ +/F15 9.96264 Tf +1 0 0 1 464.747 493.955 Tm [<0055006B0056>]TJ ET EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 240.402 523.56 Tm [<0016>]TJ +/F20 9.96264 Tf +1 0 0 1 240.402 473.671 Tm [<0016>]TJ ET EMC /Artifact BMC BT -/F23 9.96264 Tf -1 0 0 1 464.747 523.56 Tm [<0055006A0056>]TJ -1 0 0 1 148.712 501.643 Tm [<003100620067003B0042004800690067>]TJ +/F15 9.96264 Tf +1 0 0 1 464.747 473.671 Tm [<0055006A0056>]TJ +1 0 0 1 148.712 451.753 Tm [<003100620067003B0042004800690067>]TJ ET EMC /mi<> BDC BT -/F23 9.96264 Tf -1 0 0 1 180.453 501.643 Tm [<0062>]TJ +/F15 9.96264 Tf +1 0 0 1 180.453 451.753 Tm [<0062>]TJ ET EMC /mi<> BDC BT -/F23 9.96264 Tf -1 0 0 1 184.379 501.643 Tm [<0042>]TJ +/F15 9.96264 Tf +1 0 0 1 184.379 451.753 Tm [<0042>]TJ ET EMC /mi<> BDC BT -/F23 9.96264 Tf -1 0 0 1 187.148 501.643 Tm [<004D>]TJ +/F15 9.96264 Tf +1 0 0 1 187.148 451.753 Tm [<004D>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 192.687 501.643 Tm [<0009>]TJ +/F20 9.96264 Tf +1 0 0 1 192.687 451.753 Tm [<0009>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 196.563 501.643 Tm [<0527>]TJ +/F20 9.96264 Tf +1 0 0 1 196.563 451.753 Tm [<0527>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 202.262 501.643 Tm [<000A>]TJ +/F20 9.96264 Tf +1 0 0 1 202.262 451.753 Tm [<000A>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 208.351 501.643 Tm [<0A37>]TJ +/F20 9.96264 Tf +1 0 0 1 208.351 451.753 Tm [<0A37>]TJ ET EMC /mi<> BDC BT -/F23 9.96264 Tf -1 0 0 1 218.315 501.643 Tm [<0062>]TJ +/F15 9.96264 Tf +1 0 0 1 218.315 451.753 Tm [<0062>]TJ ET EMC /mi<> BDC BT -/F23 9.96264 Tf -1 0 0 1 222.241 501.643 Tm [<0042>]TJ +/F15 9.96264 Tf +1 0 0 1 222.241 451.753 Tm [<0042>]TJ ET EMC /mi<> BDC BT -/F23 9.96264 Tf -1 0 0 1 225.01 501.643 Tm [<004D>]TJ +/F15 9.96264 Tf +1 0 0 1 225.01 451.753 Tm [<004D>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 230.549 501.643 Tm [<0009>]TJ +/F20 9.96264 Tf +1 0 0 1 230.549 451.753 Tm [<0009>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 234.425 501.643 Tm [<0527>]TJ +/F20 9.96264 Tf +1 0 0 1 234.425 451.753 Tm [<0527>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 242.337 501.643 Tm [<000C>]TJ +/F20 9.96264 Tf +1 0 0 1 242.337 451.753 Tm [<000C>]TJ ET EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 252.302 501.643 Tm [<0013>]TJ +/F20 9.96264 Tf +1 0 0 1 252.302 451.753 Tm [<0013>]TJ ET EMC /mi<> BDC BT -/F28 9.96264 Tf -1 0 0 1 257.283 501.643 Tm [<117A>]TJ +/F20 9.96264 Tf +1 0 0 1 257.283 451.753 Tm [<117A>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 263.211 501.643 Tm [<000A>]TJ +/F20 9.96264 Tf +1 0 0 1 263.211 451.753 Tm [<000A>]TJ ET EMC /mo<> BDC BT -/F28 9.96264 Tf -1 0 0 1 269.853 501.643 Tm [<001E>]TJ +/F20 9.96264 Tf +1 0 0 1 269.853 451.753 Tm [<001E>]TJ ET EMC /mn<> BDC BT -/F28 9.96264 Tf -1 0 0 1 280.371 501.643 Tm [<0011>]TJ +/F20 9.96264 Tf +1 0 0 1 280.371 451.753 Tm [<0011>]TJ ET EMC /Artifact BMC BT -/F23 9.96264 Tf -1 0 0 1 285.353 501.643 Tm [<0058>]TJ +/F15 9.96264 Tf +1 0 0 1 285.353 451.753 Tm [<0058>]TJ ET EMC /Artifact BMC BT -/F23 9.96264 Tf -1 0 0 1 303.133 139.255 Tm [<0052>]TJ +/F15 9.96264 Tf +1 0 0 1 303.133 89.365 Tm [<0052>]TJ ET EMC /Artifact BMC EMC endstream endobj -232 0 obj -<< /Type /Page /Contents 233 0 R /Resources 231 0 R /MediaBox [ 0 0 595.276 841.89 ] /StructParents 0/Tabs /S /Parent 238 0 R >> +233 0 obj +<< /Type /Page /Contents 234 0 R /Resources 232 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 239 0 R >> endobj -231 0 obj -<< /ExtGState 1 0 R /Font << /F23 234 0 R /F28 235 0 R /F29 236 0 R /F40 237 0 R >> >> +232 0 obj +<< /ExtGState 1 0 R /Font << /F15 235 0 R /F20 236 0 R /F21 237 0 R /F32 238 0 R >> >> endobj 1 0 obj << /opacity1 <> >> endobj -239 0 obj +240 0 obj << /Marked true >> endobj 6 0 obj @@ -735,70 +942,70 @@ endobj << /Type /StructElem /S /Document /P 5 0 R /K [18 0 R 20 0 R 101 0 R 128 0 R 147 0 R 207 0 R] /NS 11 0 R >> endobj 18 0 obj -<< /Type /StructElem /S /P /P 17 0 R /K <> /NS 11 0 R >> +<< /Type /StructElem /S /P /P 17 0 R /K <> /NS 11 0 R >> endobj 20 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 75 0 R /AF 19 0 R /NS 11 0 R >> +<< /Type /StructElem /S /Formula /P 17 0 R /K 75 0 R /AF [19 0 R] /NS 11 0 R >> endobj 21 0 obj << /Type /StructElem /S /mtd /P 85 0 R /K 22 0 R /NS 13 0 R >> endobj 22 0 obj -<< /Type /StructElem /S /mn /P 21 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 21 0 R /K <> /NS 13 0 R >> endobj 23 0 obj << /Type /StructElem /S /mtd /P 85 0 R /K 24 0 R /NS 13 0 R >> endobj 24 0 obj -<< /Type /StructElem /S /mn /P 23 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 23 0 R /K <> /NS 13 0 R >> endobj 25 0 obj << /Type /StructElem /S /mtd /P 85 0 R /K 26 0 R /NS 13 0 R >> endobj 26 0 obj -<< /Type /StructElem /S /mn /P 25 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 25 0 R /K <> /NS 13 0 R >> endobj 27 0 obj << /Type /StructElem /S /mtd /P 86 0 R /K 28 0 R /NS 13 0 R >> endobj 28 0 obj -<< /Type /StructElem /S /mn /P 27 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 27 0 R /K <> /NS 13 0 R >> endobj 29 0 obj << /Type /StructElem /S /mtd /P 86 0 R /K 30 0 R /NS 13 0 R >> endobj 30 0 obj -<< /Type /StructElem /S /mn /P 29 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 29 0 R /K <> /NS 13 0 R >> endobj 31 0 obj << /Type /StructElem /S /mtd /P 86 0 R /K 32 0 R /NS 13 0 R >> endobj 32 0 obj -<< /Type /StructElem /S /mn /P 31 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 31 0 R /K <> /NS 13 0 R >> endobj 33 0 obj << /Type /StructElem /S /mtd /P 87 0 R /K 34 0 R /NS 13 0 R >> endobj 34 0 obj -<< /Type /StructElem /S /mn /P 33 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 33 0 R /K <> /NS 13 0 R >> endobj 35 0 obj << /Type /StructElem /S /mtd /P 87 0 R /K 36 0 R /NS 13 0 R >> endobj 36 0 obj -<< /Type /StructElem /S /mn /P 35 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 35 0 R /K <> /NS 13 0 R >> endobj 37 0 obj << /Type /StructElem /S /mtd /P 87 0 R /K 38 0 R /NS 13 0 R >> endobj 38 0 obj -<< /Type /StructElem /S /mn /P 37 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 37 0 R /K <> /NS 13 0 R >> endobj 39 0 obj << /Type /StructElem /S /mtd /P 95 0 R /K 40 0 R /NS 13 0 R >> endobj 40 0 obj -<< /Type /StructElem /S /mn /P 39 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 39 0 R /K <> /NS 13 0 R >> endobj 41 0 obj << /Type /StructElem /S /mtext /K [ 42 0 R] /NS 13 0 R >> @@ -819,19 +1026,19 @@ endobj << /Type /StructElem /S /mi /P 43 0 R /K null /NS 13 0 R >> endobj 49 0 obj -<< /Type /StructElem /S /mtext /P 64 0 R /K [<> 50 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 64 0 R /K [<> 50 0 R] /NS 13 0 R >> endobj 50 0 obj << /Type /StructElem /S /math /P 49 0 R /K [51 0 R 52 0 R 53 0 R] /NS 13 0 R >> endobj 51 0 obj -<< /Type /StructElem /S /mi /P 50 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 50 0 R /K <> /NS 13 0 R >> endobj 52 0 obj -<< /Type /StructElem /S /mo /P 50 0 R /K <> /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 50 0 R /K <> /A 47 0 R /NS 13 0 R >> endobj 53 0 obj -<< /Type /StructElem /S /mi /P 50 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 50 0 R /K <> /NS 13 0 R >> endobj 54 0 obj << /Type /StructElem /S /mtext /K [ 55 0 R] /NS 13 0 R >> @@ -873,13 +1080,13 @@ endobj << /Type /StructElem /S /mtd /P 96 0 R /K 68 0 R /NS 13 0 R >> endobj 68 0 obj -<< /Type /StructElem /S /mn /P 67 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 67 0 R /K <> /NS 13 0 R >> endobj 69 0 obj << /Type /StructElem /S /mtext /K null /NS 13 0 R >> endobj 70 0 obj -<< /Type /StructElem /S /mtext /P 73 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 73 0 R /K <> /NS 13 0 R >> endobj 71 0 obj << /Type /StructElem /S /mtext /K null /NS 13 0 R >> @@ -900,7 +1107,7 @@ endobj << /Type /StructElem /S /mrow /P 75 0 R /K [78 0 R 80 0 R 82 0 R 88 0 R 89 0 R] /NS 13 0 R >> endobj 78 0 obj -<< /Type /StructElem /S /mo /P 77 0 R /K <> /A 79 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 77 0 R /K <> /A 79 0 R /ActualText /NS 13 0 R >> endobj 80 0 obj << /Type /StructElem /S /mspace /P 77 0 R /A 81 0 R /NS 13 0 R >> @@ -924,16 +1131,16 @@ endobj << /Type /StructElem /S /mspace /P 77 0 R /A 81 0 R /NS 13 0 R >> endobj 89 0 obj -<< /Type /StructElem /S /mo /P 77 0 R /K <> /A 79 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 77 0 R /K <> /A 79 0 R /ActualText /NS 13 0 R >> endobj 90 0 obj -<< /Type /StructElem /S /mo /P 75 0 R /K <> /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 75 0 R /K <> /A 47 0 R /NS 13 0 R >> endobj 91 0 obj << /Type /StructElem /S /mrow /P 75 0 R /K [92 0 R 93 0 R 97 0 R] /NS 13 0 R >> endobj 92 0 obj -<< /Type /StructElem /S /mo /P 91 0 R /K <> /A 79 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 91 0 R /K <> /A 79 0 R /ActualText /NS 13 0 R >> endobj 93 0 obj << /Type /StructElem /S /mpadded /P 91 0 R /K 94 0 R /A 83 0 R /NS 13 0 R >> @@ -951,16 +1158,16 @@ endobj << /Type /StructElem /S /mspace /P 91 0 R /A 98 0 R /NS 13 0 R >> endobj 101 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 102 0 R /AF 100 0 R /NS 11 0 R >> +<< /Type /StructElem /S /Formula /P 17 0 R /K 102 0 R /AF [100 0 R] /NS 11 0 R >> endobj 102 0 obj << /Type /StructElem /S /math /P 101 0 R /K [103 0 R 104 0 R 105 0 R 124 0 R] /A 76 0 R /NS 13 0 R >> endobj 103 0 obj -<< /Type /StructElem /S /mi /P 102 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 102 0 R /K <> /NS 13 0 R >> endobj 104 0 obj -<< /Type /StructElem /S /mo /P 102 0 R /K <> /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 102 0 R /K <> /A 47 0 R /NS 13 0 R >> endobj 105 0 obj << /Type /StructElem /S /mfrac /P 102 0 R /K [106 0 R 121 0 R] /NS 13 0 R >> @@ -969,13 +1176,13 @@ endobj << /Type /StructElem /S /mrow /P 105 0 R /K [107 0 R 109 0 R 110 0 R 112 0 R] /NS 13 0 R >> endobj 107 0 obj -<< /Type /StructElem /S /mo /P 106 0 R /K <> /A 108 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 106 0 R /K <> /A 108 0 R /NS 13 0 R >> endobj 109 0 obj -<< /Type /StructElem /S /mi /P 106 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 106 0 R /K <> /NS 13 0 R >> endobj 110 0 obj -<< /Type /StructElem /S /mo /P 106 0 R /K <> /A 111 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 106 0 R /K <> /A 111 0 R /NS 13 0 R >> endobj 112 0 obj << /Type /StructElem /S /msqrt /P 106 0 R /K 113 0 R /NS 13 0 R >> @@ -987,37 +1194,37 @@ endobj << /Type /StructElem /S /msup /P 113 0 R /K [115 0 R 116 0 R] /NS 13 0 R >> endobj 115 0 obj -<< /Type /StructElem /S /mi /P 114 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 114 0 R /K <> /NS 13 0 R >> endobj 116 0 obj -<< /Type /StructElem /S /mn /P 114 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 114 0 R /K <> /NS 13 0 R >> endobj 117 0 obj -<< /Type /StructElem /S /mo /P 113 0 R /K <> /A 111 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 113 0 R /K <> /A 111 0 R /NS 13 0 R >> endobj 118 0 obj -<< /Type /StructElem /S /mn /P 113 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 113 0 R /K <> /NS 13 0 R >> endobj 119 0 obj -<< /Type /StructElem /S /mi /P 113 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 113 0 R /K <> /NS 13 0 R >> endobj 120 0 obj -<< /Type /StructElem /S /mi /P 113 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 113 0 R /K <> /NS 13 0 R >> endobj 121 0 obj << /Type /StructElem /S /mrow /P 105 0 R /K [122 0 R 123 0 R] /NS 13 0 R >> endobj 122 0 obj -<< /Type /StructElem /S /mn /P 121 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 121 0 R /K <> /NS 13 0 R >> endobj 123 0 obj -<< /Type /StructElem /S /mi /P 121 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 121 0 R /K <> /NS 13 0 R >> endobj 124 0 obj -<< /Type /StructElem /S /mo /P 102 0 R /K <> /A 125 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 102 0 R /K <> /A 125 0 R /NS 13 0 R >> endobj 128 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 129 0 R /AF 127 0 R /NS 11 0 R >> +<< /Type /StructElem /S /Formula /P 17 0 R /K 129 0 R /AF [127 0 R] /NS 11 0 R >> endobj 129 0 obj << /Type /StructElem /S /math /P 128 0 R /K [130 0 R 134 0 R 137 0 R 141 0 R] /A 76 0 R /NS 13 0 R >> @@ -1026,16 +1233,16 @@ endobj << /Type /StructElem /S /munder /P 129 0 R /K [131 0 R 133 0 R] /NS 13 0 R >> endobj 131 0 obj -<< /Type /StructElem /S /mo /P 130 0 R /K <> /A 132 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 130 0 R /K <> /A 132 0 R /NS 13 0 R >> endobj 133 0 obj -<< /Type /StructElem /S /mi /P 130 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 130 0 R /K <> /NS 13 0 R >> endobj 134 0 obj << /Type /StructElem /S /munder /P 129 0 R /K [135 0 R 136 0 R] /NS 13 0 R >> endobj 135 0 obj -<< /Type /StructElem /S /mi /P 134 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 134 0 R /K <> /NS 13 0 R >> endobj 136 0 obj << /Type /StructElem /S /mo /P 134 0 R /NS 13 0 R >> @@ -1044,34 +1251,34 @@ endobj << /Type /StructElem /S /mover /P 129 0 R /K [138 0 R 139 0 R] /NS 13 0 R >> endobj 138 0 obj -<< /Type /StructElem /S /mi /P 137 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 137 0 R /K <> /NS 13 0 R >> endobj 139 0 obj -<< /Type /StructElem /S /mo /P 137 0 R /K <> /A 140 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 137 0 R /K <> /A 140 0 R /ActualText /NS 13 0 R >> endobj 141 0 obj << /Type /StructElem /S /msup /P 129 0 R /K [142 0 R 143 0 R] /NS 13 0 R >> endobj 142 0 obj -<< /Type /StructElem /S /mi /P 141 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 141 0 R /K <> /NS 13 0 R >> endobj 143 0 obj -<< /Type /StructElem /S /mi /P 141 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 141 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 147 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 193 0 R /AF 146 0 R /NS 11 0 R >> +<< /Type /StructElem /S /Formula /P 17 0 R /K 193 0 R /AF [146 0 R] /NS 11 0 R >> endobj 148 0 obj << /Type /StructElem /S /mtd /P 196 0 R /K [149 0 R 150 0 R 151 0 R] /NS 13 0 R >> endobj 149 0 obj -<< /Type /StructElem /S /mi /P 148 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 148 0 R /K <> /NS 13 0 R >> endobj 150 0 obj -<< /Type /StructElem /S /mi /P 148 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 148 0 R /K <> /NS 13 0 R >> endobj 151 0 obj -<< /Type /StructElem /S /mi /P 148 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 148 0 R /K <> /NS 13 0 R >> endobj 152 0 obj << /Type /StructElem /S /mtd /P 196 0 R /K [153 0 R 154 0 R 155 0 R 156 0 R 157 0 R] /NS 13 0 R >> @@ -1080,16 +1287,16 @@ endobj << /Type /StructElem /S /mi /P 152 0 R /A 66 0 R /NS 13 0 R >> endobj 154 0 obj -<< /Type /StructElem /S /mo /P 152 0 R /K <> /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 152 0 R /K <> /A 47 0 R /NS 13 0 R >> endobj 155 0 obj -<< /Type /StructElem /S /mi /P 152 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 152 0 R /K <> /NS 13 0 R >> endobj 156 0 obj -<< /Type /StructElem /S /mi /P 152 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 152 0 R /K <> /NS 13 0 R >> endobj 157 0 obj -<< /Type /StructElem /S /mi /P 152 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 152 0 R /K <> /NS 13 0 R >> endobj 158 0 obj << /Type /StructElem /S /mtd /P 196 0 R /K 159 0 R /NS 13 0 R >> @@ -1098,16 +1305,16 @@ endobj << /Type /StructElem /S /msup /P 158 0 R /K [160 0 R 161 0 R] /NS 13 0 R >> endobj 160 0 obj -<< /Type /StructElem /S /mi /P 159 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 159 0 R /K <> /NS 13 0 R >> endobj 161 0 obj << /Type /StructElem /S /mrow /P 159 0 R /K [162 0 R 163 0 R] /NS 13 0 R >> endobj 162 0 obj -<< /Type /StructElem /S /mi /P 161 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 161 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 163 0 obj -<< /Type /StructElem /S /mi /P 161 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 161 0 R /K <> /NS 13 0 R >> endobj 164 0 obj << /Type /StructElem /S /mtd /P 196 0 R /K [165 0 R 166 0 R 168 0 R 169 0 R] /NS 13 0 R >> @@ -1116,28 +1323,28 @@ endobj << /Type /StructElem /S /mi /P 164 0 R /A 66 0 R /NS 13 0 R >> endobj 166 0 obj -<< /Type /StructElem /S /mo /P 164 0 R /K <> /A 167 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 164 0 R /K <> /A 167 0 R /NS 13 0 R >> endobj 168 0 obj -<< /Type /StructElem /S /mo /P 164 0 R /K <> /A 167 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 164 0 R /K <> /A 167 0 R /NS 13 0 R >> endobj 169 0 obj -<< /Type /StructElem /S /mn /P 164 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 164 0 R /K <> /NS 13 0 R >> endobj 170 0 obj << /Type /StructElem /S /mtd /P 199 0 R /K [171 0 R 173 0 R 174 0 R 175 0 R] /NS 13 0 R >> endobj 171 0 obj -<< /Type /StructElem /S /mo /P 170 0 R /K <> /A 172 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 170 0 R /K <> /A 172 0 R /ActualText /NS 13 0 R >> endobj 173 0 obj -<< /Type /StructElem /S /mn /P 170 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 170 0 R /K <> /NS 13 0 R >> endobj 174 0 obj -<< /Type /StructElem /S /mo /P 170 0 R /K <> /A 111 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 170 0 R /K <> /A 111 0 R /NS 13 0 R >> endobj 175 0 obj -<< /Type /StructElem /S /mn /P 170 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 170 0 R /K <> /NS 13 0 R >> endobj 176 0 obj << /Type /StructElem /S /mtd /P 199 0 R /K [177 0 R 178 0 R 179 0 R 180 0 R] /NS 13 0 R >> @@ -1146,13 +1353,13 @@ endobj << /Type /StructElem /S /mi /P 176 0 R /A 66 0 R /NS 13 0 R >> endobj 178 0 obj -<< /Type /StructElem /S /mo /P 176 0 R /K <> /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 176 0 R /K <> /A 47 0 R /NS 13 0 R >> endobj 179 0 obj -<< /Type /StructElem /S /mn /P 176 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 176 0 R /K <> /NS 13 0 R >> endobj 180 0 obj -<< /Type /StructElem /S /mo /P 176 0 R /K <> /A 172 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 176 0 R /K <> /A 172 0 R /ActualText /NS 13 0 R >> endobj 181 0 obj << /Type /StructElem /S /mtd /P 199 0 R /K 182 0 R /NS 13 0 R >> @@ -1170,7 +1377,7 @@ endobj << /Type /StructElem /S /mtd /P 202 0 R /K 186 0 R /NS 13 0 R >> endobj 186 0 obj -<< /Type /StructElem /S /mn /P 185 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 185 0 R /K <> /NS 13 0 R >> endobj 187 0 obj << /Type /StructElem /S /mtd /P 202 0 R /K 188 0 R /NS 13 0 R >> @@ -1224,7 +1431,7 @@ endobj << /Type /StructElem /S /mtext /P 203 0 R /NS 13 0 R >> endobj 207 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 208 0 R /AF 206 0 R /NS 11 0 R >> +<< /Type /StructElem /S /Formula /P 17 0 R /K 208 0 R /AF [206 0 R] /NS 11 0 R >> endobj 208 0 obj << /Type /StructElem /S /math /P 207 0 R /K [209 0 R 213 0 R 215 0 R 216 0 R 217 0 R 218 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R] /NS 13 0 R >> @@ -1233,76 +1440,76 @@ endobj << /Type /StructElem /S /mrow /P 208 0 R /K [210 0 R 211 0 R 212 0 R] /NS 13 0 R >> endobj 210 0 obj -<< /Type /StructElem /S /mi /P 209 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 209 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 211 0 obj -<< /Type /StructElem /S /mi /P 209 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 209 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 212 0 obj -<< /Type /StructElem /S /mi /P 209 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 209 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 213 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> endobj 215 0 obj -<< /Type /StructElem /S /mi /P 208 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 208 0 R /K <> /NS 13 0 R >> endobj 216 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> endobj 217 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 111 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 111 0 R /NS 13 0 R >> endobj 218 0 obj << /Type /StructElem /S /mrow /P 208 0 R /K [219 0 R 220 0 R 221 0 R] /NS 13 0 R >> endobj 219 0 obj -<< /Type /StructElem /S /mi /P 218 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 218 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 220 0 obj -<< /Type /StructElem /S /mi /P 218 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 218 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 221 0 obj -<< /Type /StructElem /S /mi /P 218 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 218 0 R /K <> /A 144 0 R /NS 13 0 R >> endobj 222 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> endobj 223 0 obj -<< /Type /StructElem /S /mi /P 208 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 208 0 R /K <> /NS 13 0 R >> endobj 224 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 111 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 111 0 R /NS 13 0 R >> endobj 225 0 obj -<< /Type /StructElem /S /mn /P 208 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 208 0 R /K <> /NS 13 0 R >> endobj 226 0 obj -<< /Type /StructElem /S /mi /P 208 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 208 0 R /K <> /NS 13 0 R >> endobj 227 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> endobj 228 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 47 0 R /NS 13 0 R >> endobj 229 0 obj -<< /Type /StructElem /S /mn /P 208 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 208 0 R /K <> /NS 13 0 R >> endobj 5 0 obj << /Type /StructTreeRoot /K 17 0 R /ParentTree 6 0 R /RoleMap 7 0 R /Namespaces 8 0 R >> endobj -240 0 obj +241 0 obj [ 66 [ 323 ] ] endobj -242 0 obj +243 0 obj << /Subtype /CIDFontType0C /Length 592 >> [BINARY STREAM] endobj -241 0 obj -<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 242 0 R >> +242 0 obj +<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 243 0 R >> endobj -243 0 obj +244 0 obj << /Length 687 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1338,23 +1545,23 @@ end %%EOF endstream endobj -237 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 244 0 R ] /ToUnicode 243 0 R >> -endobj -244 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 241 0 R /W 240 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +238 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 245 0 R ] /ToUnicode 244 0 R >> endobj 245 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 242 0 R /W 241 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +246 0 obj [ 1013 [ 569 ] 1404 [ 620 ] 2981 [ 407 ] 4558 [ 668 ] ] endobj -247 0 obj +248 0 obj << /Subtype /CIDFontType0C /Length 1102 >> [BINARY STREAM] endobj -246 0 obj -<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 247 0 R >> +247 0 obj +<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 248 0 R >> endobj -248 0 obj +249 0 obj << /Length 772 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1393,23 +1600,23 @@ end %%EOF endstream endobj -236 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 249 0 R ] /ToUnicode 248 0 R >> -endobj -249 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 246 0 R /W 245 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +237 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 250 0 R ] /ToUnicode 249 0 R >> endobj 250 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 247 0 R /W 246 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +251 0 obj [ 9 [ 389 389 ] 12 [ 778 ] 15 [ 278 ] 17 [ 500 500 500 500 500 500 ] 30 [ 778 ] 1296 [ 529 429 433 520 466 490 ] 1319 [ 572 ] 1790 [ 0 ] 2455 [ 663 663 ] 2503 [ 875 875 875 875 875 875 ] 2515 [ 902 ] 2615 [ 778 ] 2619 [ 778 ] 3074 [ 1444 ] 3077 [ 833 ] 4474 [ 570 ] ] endobj -252 0 obj +253 0 obj << /Subtype /CIDFontType0C /Length 4088 >> [BINARY STREAM] endobj -251 0 obj -<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 252 0 R >> +252 0 obj +<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 253 0 R >> endobj -253 0 obj +254 0 obj << /Length 1203 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1477,23 +1684,23 @@ end %%EOF endstream endobj -235 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 254 0 R ] /ToUnicode 253 0 R >> -endobj -254 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 251 0 R /W 250 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +236 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 255 0 R ] /ToUnicode 254 0 R >> endobj 255 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 252 0 R /W 251 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +256 0 obj [ 49 [ 681 444 ] 55 [ 306 ] 59 [ 500 ] 63 [ 556 ] 66 [ 278 ] 72 [ 278 ] 77 [ 556 ] 81 [ 500 500 ] 85 [ 389 389 ] 88 [ 278 ] 98 [ 394 ] 103 [ 333 ] 105 [ 389 500 500 ] ] endobj -257 0 obj +258 0 obj << /Subtype /CIDFontType0C /Length 2411 >> [BINARY STREAM] endobj -256 0 obj -<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 257 0 R >> +257 0 obj +<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 258 0 R >> endobj -258 0 obj +259 0 obj << /Length 931 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1546,287 +1753,288 @@ end %%EOF endstream endobj -234 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 259 0 R ] /ToUnicode 258 0 R >> -endobj -259 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 256 0 R /W 255 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> -endobj -238 0 obj -<< /Type /Pages /Count 1 /Kids [ 232 0 R ] >> +235 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 260 0 R ] /ToUnicode 259 0 R >> endobj 260 0 obj -<< /Type /Catalog /Pages 238 0 R /MarkInfo 239 0 R/Lang (en-US)/StructTreeRoot 5 0 R >> +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 257 0 R /W 256 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +239 0 obj +<< /Type /Pages /Count 1 /Kids [ 233 0 R ] >> endobj 261 0 obj -<< /Producer (LuaTeX-1.13.2) /Creator (TeX) /CreationDate (D:20160520110000+02'00') /ModDate (D:20160520110000+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.13.2 (TeX Live 2021)) >> +<< /Type /Catalog /Pages 239 0 R /MarkInfo 240 0 R/Lang (en-US)/Metadata 231 0 R/StructTreeRoot 5 0 R >> +endobj +262 0 obj +<< /Producer (luahbtex-1.15.0)/Creator (LaTeX)/CreationDate (D:20221204074910+01'00')/ModDate (D:20221204074910+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.15.0 (TeX Live 2022)) >> endobj xref -0 262 +0 263 0000000002 65535 f -0000015844 00000 n +0000026222 00000 n 0000000003 00000 f 0000000004 00000 f 0000000010 00000 f -0000036238 00000 n -0000015928 00000 n -0000016591 00000 n -0000016919 00000 n -0000016613 00000 n +0000046626 00000 n +0000026306 00000 n +0000026969 00000 n +0000027297 00000 n +0000026991 00000 n 0000000012 00000 f -0000016681 00000 n +0000027059 00000 n 0000000014 00000 f -0000016751 00000 n +0000027129 00000 n 0000000016 00000 f -0000016832 00000 n +0000027210 00000 n 0000000000 00000 f -0000016966 00000 n -0000017092 00000 n +0000027344 00000 n +0000027470 00000 n 0000001940 00000 n -0000017200 00000 n -0000017296 00000 n -0000017377 00000 n -0000017486 00000 n -0000017567 00000 n -0000017676 00000 n -0000017757 00000 n -0000017866 00000 n -0000017947 00000 n -0000018056 00000 n -0000018137 00000 n -0000018246 00000 n -0000018327 00000 n -0000018436 00000 n -0000018517 00000 n -0000018626 00000 n -0000018707 00000 n -0000018816 00000 n -0000018897 00000 n -0000019007 00000 n -0000019088 00000 n -0000019198 00000 n -0000019274 00000 n -0000019356 00000 n +0000027578 00000 n +0000027676 00000 n +0000027757 00000 n +0000027866 00000 n +0000027947 00000 n +0000028056 00000 n +0000028137 00000 n +0000028246 00000 n +0000028327 00000 n +0000028436 00000 n +0000028517 00000 n +0000028626 00000 n +0000028707 00000 n +0000028816 00000 n +0000028897 00000 n +0000029006 00000 n +0000029087 00000 n +0000029196 00000 n +0000029277 00000 n +0000029387 00000 n +0000029468 00000 n +0000029578 00000 n +0000029654 00000 n +0000029736 00000 n 0000000020 00000 n -0000019467 00000 n -0000019545 00000 n +0000029847 00000 n +0000029925 00000 n 0000000093 00000 n -0000019634 00000 n -0000019712 00000 n -0000019834 00000 n -0000019932 00000 n -0000020042 00000 n -0000020163 00000 n -0000020273 00000 n -0000020349 00000 n -0000020447 00000 n -0000020525 00000 n -0000020614 00000 n -0000020692 00000 n -0000020768 00000 n -0000020866 00000 n -0000020944 00000 n -0000021033 00000 n -0000021111 00000 n -0000021201 00000 n +0000030014 00000 n +0000030092 00000 n +0000030214 00000 n +0000030312 00000 n +0000030422 00000 n +0000030543 00000 n +0000030653 00000 n +0000030729 00000 n +0000030827 00000 n +0000030905 00000 n +0000030994 00000 n +0000031072 00000 n +0000031148 00000 n +0000031246 00000 n +0000031324 00000 n +0000031413 00000 n +0000031491 00000 n +0000031581 00000 n 0000000164 00000 n -0000021282 00000 n -0000021363 00000 n -0000021473 00000 n -0000021544 00000 n -0000021657 00000 n -0000021728 00000 n -0000021799 00000 n -0000021889 00000 n -0000021970 00000 n +0000031662 00000 n +0000031743 00000 n +0000031853 00000 n +0000031924 00000 n +0000032037 00000 n +0000032108 00000 n +0000032179 00000 n +0000032269 00000 n +0000032350 00000 n 0000000219 00000 n -0000022079 00000 n -0000022191 00000 n +0000032459 00000 n +0000032571 00000 n 0000000273 00000 n -0000022334 00000 n +0000032714 00000 n 0000000360 00000 n -0000022419 00000 n +0000032799 00000 n 0000000415 00000 n -0000022515 00000 n -0000022615 00000 n -0000022712 00000 n -0000022809 00000 n -0000022906 00000 n -0000022991 00000 n -0000023135 00000 n -0000023256 00000 n -0000023354 00000 n -0000023498 00000 n -0000023594 00000 n -0000023687 00000 n -0000023777 00000 n -0000023867 00000 n +0000032895 00000 n +0000032995 00000 n +0000033092 00000 n +0000033189 00000 n +0000033286 00000 n +0000033371 00000 n +0000033515 00000 n +0000033636 00000 n +0000033734 00000 n +0000033878 00000 n +0000033974 00000 n +0000034067 00000 n +0000034157 00000 n +0000034247 00000 n 0000000487 00000 n 0000000541 00000 n 0000003009 00000 n -0000023952 00000 n -0000024051 00000 n -0000024173 00000 n -0000024285 00000 n -0000024408 00000 n -0000024504 00000 n -0000024615 00000 n +0000034332 00000 n +0000034433 00000 n +0000034555 00000 n +0000034667 00000 n +0000034790 00000 n +0000034886 00000 n +0000034997 00000 n 0000002118 00000 n -0000024739 00000 n -0000024851 00000 n +0000035121 00000 n +0000035233 00000 n 0000002184 00000 n -0000024975 00000 n -0000025061 00000 n -0000025180 00000 n -0000025275 00000 n -0000025387 00000 n -0000025499 00000 n -0000025623 00000 n -0000025735 00000 n -0000025847 00000 n -0000025959 00000 n -0000026054 00000 n -0000026166 00000 n -0000026278 00000 n +0000035357 00000 n +0000035443 00000 n +0000035562 00000 n +0000035657 00000 n +0000035769 00000 n +0000035881 00000 n +0000036005 00000 n +0000036117 00000 n +0000036229 00000 n +0000036341 00000 n +0000036436 00000 n +0000036548 00000 n +0000036660 00000 n 0000002256 00000 n 0000002316 00000 n 0000003879 00000 n -0000026402 00000 n -0000026501 00000 n -0000026623 00000 n -0000026720 00000 n +0000036784 00000 n +0000036885 00000 n +0000037007 00000 n +0000037104 00000 n 0000003190 00000 n -0000026844 00000 n -0000026956 00000 n -0000027053 00000 n -0000027165 00000 n -0000027237 00000 n -0000027333 00000 n -0000027445 00000 n +0000037228 00000 n +0000037340 00000 n +0000037437 00000 n +0000037549 00000 n +0000037621 00000 n +0000037717 00000 n +0000037829 00000 n 0000003276 00000 n -0000027592 00000 n -0000027687 00000 n -0000027799 00000 n +0000037976 00000 n +0000038071 00000 n +0000038183 00000 n 0000003331 00000 n 0000003391 00000 n 0000005868 00000 n -0000027923 00000 n -0000028022 00000 n -0000028124 00000 n -0000028236 00000 n -0000028348 00000 n -0000028460 00000 n -0000028578 00000 n -0000028661 00000 n -0000028784 00000 n -0000028896 00000 n -0000029008 00000 n -0000029120 00000 n -0000029204 00000 n -0000029299 00000 n -0000029411 00000 n -0000029506 00000 n -0000029630 00000 n -0000029742 00000 n -0000029852 00000 n -0000029935 00000 n +0000038307 00000 n +0000038408 00000 n +0000038510 00000 n +0000038622 00000 n +0000038734 00000 n +0000038846 00000 n +0000038964 00000 n +0000039047 00000 n +0000039170 00000 n +0000039282 00000 n +0000039394 00000 n +0000039506 00000 n +0000039590 00000 n +0000039685 00000 n +0000039797 00000 n +0000039892 00000 n +0000040016 00000 n +0000040128 00000 n +0000040238 00000 n +0000040321 00000 n 0000004060 00000 n -0000030059 00000 n -0000030183 00000 n -0000030295 00000 n -0000030405 00000 n +0000040445 00000 n +0000040569 00000 n +0000040681 00000 n +0000040791 00000 n 0000004126 00000 n -0000030552 00000 n -0000030664 00000 n -0000030788 00000 n -0000030900 00000 n -0000031010 00000 n -0000031093 00000 n -0000031216 00000 n -0000031328 00000 n -0000031475 00000 n -0000031559 00000 n -0000031642 00000 n -0000031726 00000 n -0000031809 00000 n -0000031893 00000 n -0000032005 00000 n -0000032089 00000 n -0000032172 00000 n -0000032256 00000 n -0000032339 00000 n -0000032423 00000 n -0000032506 00000 n -0000032602 00000 n +0000040938 00000 n +0000041050 00000 n +0000041174 00000 n +0000041286 00000 n +0000041396 00000 n +0000041479 00000 n +0000041602 00000 n +0000041714 00000 n +0000041861 00000 n +0000041945 00000 n +0000042028 00000 n +0000042112 00000 n +0000042195 00000 n +0000042279 00000 n +0000042391 00000 n +0000042475 00000 n +0000042558 00000 n +0000042642 00000 n +0000042725 00000 n +0000042809 00000 n +0000042892 00000 n +0000042988 00000 n 0000004250 00000 n -0000032719 00000 n -0000032844 00000 n -0000032928 00000 n -0000033003 00000 n -0000033128 00000 n -0000033212 00000 n -0000033287 00000 n -0000033412 00000 n -0000033496 00000 n +0000043105 00000 n +0000043230 00000 n +0000043314 00000 n +0000043389 00000 n +0000043514 00000 n +0000043598 00000 n +0000043673 00000 n +0000043798 00000 n +0000043882 00000 n 0000004368 00000 n 0000007180 00000 n -0000033571 00000 n -0000033670 00000 n -0000033861 00000 n -0000033964 00000 n -0000034088 00000 n -0000034212 00000 n -0000034336 00000 n +0000043957 00000 n +0000044058 00000 n +0000044249 00000 n +0000044352 00000 n +0000044476 00000 n +0000044600 00000 n +0000044724 00000 n 0000006049 00000 n -0000034460 00000 n -0000034572 00000 n -0000034696 00000 n -0000034820 00000 n -0000034923 00000 n -0000035047 00000 n -0000035171 00000 n -0000035295 00000 n -0000035419 00000 n -0000035531 00000 n -0000035655 00000 n -0000035767 00000 n -0000035879 00000 n -0000036003 00000 n -0000036126 00000 n +0000044848 00000 n +0000044960 00000 n +0000045084 00000 n +0000045208 00000 n +0000045311 00000 n +0000045435 00000 n +0000045559 00000 n +0000045683 00000 n +0000045807 00000 n +0000045919 00000 n +0000046043 00000 n +0000046155 00000 n +0000046267 00000 n +0000046391 00000 n +0000046514 00000 n 0000006125 00000 n -0000015740 00000 n -0000015594 00000 n 0000007361 00000 n -0000051298 00000 n -0000047029 00000 n -0000040705 00000 n -0000038023 00000 n -0000051658 00000 n -0000015891 00000 n -0000036343 00000 n -0000037052 00000 n -0000036375 00000 n -0000037275 00000 n -0000038179 00000 n -0000038381 00000 n -0000039641 00000 n -0000038454 00000 n -0000039872 00000 n -0000040868 00000 n -0000041077 00000 n -0000045535 00000 n -0000041362 00000 n -0000045765 00000 n -0000047192 00000 n -0000047401 00000 n -0000050083 00000 n -0000047587 00000 n -0000050306 00000 n -0000051455 00000 n -0000051722 00000 n -0000051827 00000 n +0000026118 00000 n +0000025979 00000 n +0000017743 00000 n +0000061686 00000 n +0000057417 00000 n +0000051093 00000 n +0000048411 00000 n +0000062046 00000 n +0000026269 00000 n +0000046731 00000 n +0000047440 00000 n +0000046763 00000 n +0000047663 00000 n +0000048567 00000 n +0000048769 00000 n +0000050029 00000 n +0000048842 00000 n +0000050260 00000 n +0000051256 00000 n +0000051465 00000 n +0000055923 00000 n +0000051750 00000 n +0000056153 00000 n +0000057580 00000 n +0000057789 00000 n +0000060471 00000 n +0000057975 00000 n +0000060694 00000 n +0000061843 00000 n +0000062110 00000 n +0000062232 00000 n trailer -<< /Size 262 /Root 260 0 R /Info 261 0 R /ID [ <4F23DD47C2CB1E4A823FC7CBBBCDBD14> <4F23DD47C2CB1E4A823FC7CBBBCDBD14> ] >> +<< /Size 263 /Root 261 0 R /Info 262 0 R /ID [ <4F23DD47C2CB1E4A823FC7CBBBCDBD14> <4F23DD47C2CB1E4A823FC7CBBBCDBD14> ] >> startxref -52050 +62460 %%EOF diff --git a/testfiles-lua/test_xml.mlr b/testfiles-lua/test_xml.mlr index 6d2098c..f367c71 100644 --- a/testfiles-lua/test_xml.mlr +++ b/testfiles-lua/test_xml.mlr @@ -1,3 +1,25 @@ + + + ๐‘Ž + = + ๐‘ + + + + ๐‘Ž + = + ๐‘ + + + ๐‘Ž + = + ๐‘ + + + ๐‘Ž + = + ๐‘ + ( @@ -53,11 +75,12 @@ if  - + ๐‘Ž = ๐‘ - + + @@ -66,6 +89,7 @@ else + From e84079ee73007fb735f6797385ce48fdc16f1a0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 4 Dec 2022 08:38:32 +0100 Subject: [PATCH 094/206] Update preambles --- test_structelem.tex | 5 +- test_tex.tex | 9 +- testfiles-lua/cases.mlt | 8 +- testfiles-lua/test_struct.pvt | 10 +- testfiles-lua/test_struct.tpf | 1086 +++++++++++++++++---------------- testfiles-lua/test_xml.mlt | 10 +- 6 files changed, 556 insertions(+), 572 deletions(-) diff --git a/test_structelem.tex b/test_structelem.tex index 5fd6e33..f493731 100644 --- a/test_structelem.tex +++ b/test_structelem.tex @@ -1,12 +1,9 @@ % !Mode:: "TeX:DE:UTF-8:Main" \PassOptionsToPackage{enable-debug,check-declarations}{expl3} -\RequirePackage{pdfmanagement-testphase} -\DeclareDocumentMetadata{uncompress,pdfversion=2.0} +\DocumentMetadata{uncompress,pdfversion=2.0,testphase = phase-I} \RequirePackage{expl3} \documentclass{article} \usepackage{unicode-math} -\usepackage{tagpdf} -\tagpdfsetup{activate-all,interwordspace=true,} \usepackage{amsmath} \usepackage{luamml} % \RegisterFamilyMapping\symsymbols{oms} diff --git a/test_tex.tex b/test_tex.tex index 8cc28cc..d3aedaa 100644 --- a/test_tex.tex +++ b/test_tex.tex @@ -1,15 +1,10 @@ -\RequirePackage{pdfmanagement-testphase} -\DeclareDocumentMetadata{ +\DocumentMetadata{ uncompress, pdfversion = 2.0, + testphase = phase-I, } \documentclass{article} \usepackage{luamml-demo} -\usepackage{tagpdf} -\tagpdfsetup{ - activate-all, - interwordspace=true, -} \usepackage{unicode-math} diff --git a/testfiles-lua/cases.mlt b/testfiles-lua/cases.mlt index a0bfb14..68f8414 100644 --- a/testfiles-lua/cases.mlt +++ b/testfiles-lua/cases.mlt @@ -1,15 +1,11 @@ -\RequirePackage{pdfmanagement-testphase} \DeclareDocumentMetadata{ uncompress, pdfversion = 2.0, + testphase = phase-I, } +\input{regression-test} \documentclass{article} \usepackage[l3build]{luamml-demo} -\usepackage{tagpdf} -\tagpdfsetup{ - activate-all, - interwordspace=true, -} \begin{document} \tagstructbegin{tag=Document} diff --git a/testfiles-lua/test_struct.pvt b/testfiles-lua/test_struct.pvt index 2abba81..bd2e507 100644 --- a/testfiles-lua/test_struct.pvt +++ b/testfiles-lua/test_struct.pvt @@ -1,18 +1,14 @@ \ExplSyntaxOn \sys_gset_rand_seed:n{1000} \ExplSyntaxOff -\RequirePackage{pdfmanagement-testphase} -\DeclareDocumentMetadata{ +\DocumentMetadata{ uncompress, pdfversion = 2.0, + testphase = phase-I, } +\input{regression-test} \documentclass{article} -\usepackage{tagpdf} \usepackage[structelem]{luamml-demo} -\tagpdfsetup{ - activate-all, - interwordspace=true, -} \usepackage{unicode-math} diff --git a/testfiles-lua/test_struct.tpf b/testfiles-lua/test_struct.tpf index ef8484e..72ac197 100644 --- a/testfiles-lua/test_struct.tpf +++ b/testfiles-lua/test_struct.tpf @@ -1,110 +1,110 @@ %PDF-2.0 %ฬีมิลุะฤฦ -44 0 obj +45 0 obj << /O/NSO/NS 13 0 R/displaystyle(true)/scriptlevel(0) >> endobj -47 0 obj +48 0 obj << /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0.278em) >> endobj -66 0 obj +67 0 obj << /O/NSO/NS 13 0 R/intent(@ignore) >> endobj -76 0 obj +77 0 obj << /O/NSO/NS 13 0 R/display(block) >> endobj -79 0 obj +80 0 obj << /O/NSO/NS 13 0 R/fence(true)/lspace(0)/rspace(0)/symmetric(true) >> endobj -81 0 obj +82 0 obj << /O/NSO/NS 13 0 R/width(-4.981pt) >> endobj -83 0 obj +84 0 obj << /O/NSO/NS 13 0 R/lspace(+4.981pt)/width(+9.963pt) >> endobj -98 0 obj +99 0 obj << /O/NSO/NS 13 0 R/width(1.196pt) >> endobj -99 0 obj +100 0 obj <> stream (100010001)={1ifย ๐‘Ž=๐‘2else endstream endobj -19 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +20 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -108 0 obj +109 0 obj << /O/NSO/NS 13 0 R/lspace(0)/rspace(0.222em) >> endobj -111 0 obj +112 0 obj << /O/NSO/NS 13 0 R/lspace(0.222em)/rspace(0.222em) >> endobj -125 0 obj +126 0 obj << /O/NSO/NS 13 0 R/lspace(0)/rspace(0) >> endobj -126 0 obj +127 0 obj <> stream ๐‘ฅ=โˆ’๐‘ยฑ๐‘2โˆ’4๐‘Ž๐‘2๐‘Ž. endstream endobj -100 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +101 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -132 0 obj +133 0 obj << /O/NSO/NS 13 0 R/lspace(0)/movablelimits(true)/rspace(0.167em) >> endobj -140 0 obj +141 0 obj << /O/NSO/NS 13 0 R/stretchy(true) >> endobj -144 0 obj +145 0 obj << /O/NSO/NS 13 0 R/mathvariant(normal) >> endobj -145 0 obj +146 0 obj <> stream โˆ‘๐‘Ž๐‘_๐‘.๐‘โ€ฒ endstream endobj -127 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +128 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -167 0 obj +168 0 obj << /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0) >> endobj -172 0 obj +173 0 obj << /O/NSO/NS 13 0 R/fence(true)/lspace(0)/maxsize(17.861pt)/minsize(17.861pt)/rspace(0)/symmetric(true) >> endobj -195 0 obj +196 0 obj << /O/NSO/NS 13 0 R/columnalign(right left right left)/columnspacing(0 .8em 0)/displaystyle(true) >> endobj -205 0 obj +206 0 obj <> stream (1)๐‘Ž๐‘๐‘=๐‘‘๐‘’๐‘“๐‘’i๐œ‹=โˆ’1(2)(1+2=3)(3)5 endstream endobj -146 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +147 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -214 0 obj +215 0 obj << /O/NSO/NS 13 0 R/lspace(0)/rspace(0)/stretchy(false) >> endobj -230 0 obj +231 0 obj <> stream sin(๐‘ฅ)โˆ’sin(๐‘ฅ+2๐œ‹)=0 endstream endobj -206 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +207 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -231 0 obj +232 0 obj << /Type /Metadata /Subtype /XML /Length 10291 >> stream @@ -278,7 +278,7 @@ stream - luahbtex-1.15.1 + luahbtex-1.15.0 2.0 @@ -292,17 +292,17 @@ stream - 2022-12-04T07:49:10+01:00 + 2001-01-01T20:59:59-00:00 application/pdf test_struct.tex LaTeX - 2022-12-04T07:49:10+01:00 - 2022-12-04T07:49:10+01:00 - 2022-12-04T07:49:10+01:00 + 2001-01-01T20:59:59-00:00 + 2001-01-01T20:59:59-00:00 + 2001-01-01T20:59:59-00:00 uuid:0629f6ef-2113-4b62-83f8-5725311a8337 - uuid:30145665-c0d5-49c3-8864-4194d811e742 + uuid:0a57c455-157a-4141-8c19-6237d832fc80 three 1 @@ -311,7 +311,7 @@ stream endstream endobj -234 0 obj +235 0 obj << /Length 8175 >> stream /opacity1 gs @@ -904,20 +904,20 @@ EMC EMC endstream endobj -233 0 obj -<< /Type /Page /Contents 234 0 R /Resources 232 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 239 0 R >> +234 0 obj +<< /Type /Page /Contents 235 0 R /Resources 233 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 240 0 R >> endobj -232 0 obj -<< /ExtGState 1 0 R /Font << /F15 235 0 R /F20 236 0 R /F21 237 0 R /F32 238 0 R >> >> +233 0 obj +<< /ExtGState 1 0 R /Font << /F15 236 0 R /F20 237 0 R /F21 238 0 R /F32 239 0 R >> >> endobj 1 0 obj << /opacity1 <> >> endobj -240 0 obj +241 0 obj << /Marked true >> endobj 6 0 obj -<< /Nums [0 [ 18 0 R 78 0 R 22 0 R 24 0 R 26 0 R 28 0 R 30 0 R 32 0 R 34 0 R 36 0 R 38 0 R 89 0 R 90 0 R 92 0 R 40 0 R 49 0 R 51 0 R 52 0 R 53 0 R 68 0 R 70 0 R 103 0 R 104 0 R 107 0 R 109 0 R 110 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 122 0 R 123 0 R 124 0 R 131 0 R 133 0 R 135 0 R 139 0 R 138 0 R 142 0 R 143 0 R 149 0 R 150 0 R 151 0 R 154 0 R 155 0 R 156 0 R 157 0 R 160 0 R 162 0 R 163 0 R 166 0 R 168 0 R 169 0 R 171 0 R 173 0 R 174 0 R 175 0 R 178 0 R 179 0 R 180 0 R 186 0 R 210 0 R 211 0 R 212 0 R 213 0 R 215 0 R 216 0 R 217 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R] +<< /Nums [0 [ 19 0 R 79 0 R 23 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 90 0 R 91 0 R 93 0 R 41 0 R 50 0 R 52 0 R 53 0 R 54 0 R 69 0 R 71 0 R 104 0 R 105 0 R 108 0 R 110 0 R 111 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 123 0 R 124 0 R 125 0 R 132 0 R 134 0 R 136 0 R 140 0 R 139 0 R 143 0 R 144 0 R 150 0 R 151 0 R 152 0 R 155 0 R 156 0 R 157 0 R 158 0 R 161 0 R 163 0 R 164 0 R 167 0 R 169 0 R 170 0 R 172 0 R 174 0 R 175 0 R 176 0 R 179 0 R 180 0 R 181 0 R 187 0 R 211 0 R 212 0 R 213 0 R 214 0 R 216 0 R 217 0 R 218 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R] ] >> endobj 7 0 obj @@ -939,577 +939,580 @@ endobj [ 9 0 R 11 0 R 13 0 R 15 0 R ] endobj 17 0 obj -<< /Type /StructElem /S /Document /P 5 0 R /K [18 0 R 20 0 R 101 0 R 128 0 R 147 0 R 207 0 R] /NS 11 0 R >> +<< /Type /StructElem /S /Document /P 5 0 R /K 18 0 R /NS 11 0 R >> endobj 18 0 obj -<< /Type /StructElem /S /P /P 17 0 R /K <> /NS 11 0 R >> +<< /Type /StructElem /S /Document /P 17 0 R /K [19 0 R 21 0 R 102 0 R 129 0 R 148 0 R 208 0 R] /NS 11 0 R >> endobj -20 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 75 0 R /AF [19 0 R] /NS 11 0 R >> +19 0 obj +<< /Type /StructElem /S /P /P 18 0 R /K <> /NS 11 0 R >> endobj 21 0 obj -<< /Type /StructElem /S /mtd /P 85 0 R /K 22 0 R /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 18 0 R /K 76 0 R /AF [20 0 R] /NS 11 0 R >> endobj 22 0 obj -<< /Type /StructElem /S /mn /P 21 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 86 0 R /K 23 0 R /NS 13 0 R >> endobj 23 0 obj -<< /Type /StructElem /S /mtd /P 85 0 R /K 24 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 22 0 R /K <> /NS 13 0 R >> endobj 24 0 obj -<< /Type /StructElem /S /mn /P 23 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 86 0 R /K 25 0 R /NS 13 0 R >> endobj 25 0 obj -<< /Type /StructElem /S /mtd /P 85 0 R /K 26 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 24 0 R /K <> /NS 13 0 R >> endobj 26 0 obj -<< /Type /StructElem /S /mn /P 25 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 86 0 R /K 27 0 R /NS 13 0 R >> endobj 27 0 obj -<< /Type /StructElem /S /mtd /P 86 0 R /K 28 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 26 0 R /K <> /NS 13 0 R >> endobj 28 0 obj -<< /Type /StructElem /S /mn /P 27 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 87 0 R /K 29 0 R /NS 13 0 R >> endobj 29 0 obj -<< /Type /StructElem /S /mtd /P 86 0 R /K 30 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 28 0 R /K <> /NS 13 0 R >> endobj 30 0 obj -<< /Type /StructElem /S /mn /P 29 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 87 0 R /K 31 0 R /NS 13 0 R >> endobj 31 0 obj -<< /Type /StructElem /S /mtd /P 86 0 R /K 32 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 30 0 R /K <> /NS 13 0 R >> endobj 32 0 obj -<< /Type /StructElem /S /mn /P 31 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 87 0 R /K 33 0 R /NS 13 0 R >> endobj 33 0 obj -<< /Type /StructElem /S /mtd /P 87 0 R /K 34 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 32 0 R /K <> /NS 13 0 R >> endobj 34 0 obj -<< /Type /StructElem /S /mn /P 33 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 88 0 R /K 35 0 R /NS 13 0 R >> endobj 35 0 obj -<< /Type /StructElem /S /mtd /P 87 0 R /K 36 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 34 0 R /K <> /NS 13 0 R >> endobj 36 0 obj -<< /Type /StructElem /S /mn /P 35 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 88 0 R /K 37 0 R /NS 13 0 R >> endobj 37 0 obj -<< /Type /StructElem /S /mtd /P 87 0 R /K 38 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 36 0 R /K <> /NS 13 0 R >> endobj 38 0 obj -<< /Type /StructElem /S /mn /P 37 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 88 0 R /K 39 0 R /NS 13 0 R >> endobj 39 0 obj -<< /Type /StructElem /S /mtd /P 95 0 R /K 40 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 38 0 R /K <> /NS 13 0 R >> endobj 40 0 obj -<< /Type /StructElem /S /mn /P 39 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 96 0 R /K 41 0 R /NS 13 0 R >> endobj 41 0 obj -<< /Type /StructElem /S /mtext /K [ 42 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 40 0 R /K <> /NS 13 0 R >> endobj 42 0 obj -<< /Type /StructElem /S /math /P 41 0 R /K 43 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K [ 43 0 R] /NS 13 0 R >> endobj 43 0 obj -<< /Type /StructElem /S /mstyle /P 42 0 R /K [45 0 R 46 0 R 48 0 R] /A 44 0 R /NS 13 0 R >> +<< /Type /StructElem /S /math /P 42 0 R /K 44 0 R /NS 13 0 R >> endobj -45 0 obj -<< /Type /StructElem /S /mi /P 43 0 R /K null /NS 13 0 R >> +44 0 obj +<< /Type /StructElem /S /mstyle /P 43 0 R /K [46 0 R 47 0 R 49 0 R] /A 45 0 R /NS 13 0 R >> endobj 46 0 obj -<< /Type /StructElem /S /mo /P 43 0 R /K null /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 44 0 R /K null /NS 13 0 R >> endobj -48 0 obj -<< /Type /StructElem /S /mi /P 43 0 R /K null /NS 13 0 R >> +47 0 obj +<< /Type /StructElem /S /mo /P 44 0 R /K null /A 48 0 R /NS 13 0 R >> endobj 49 0 obj -<< /Type /StructElem /S /mtext /P 64 0 R /K [<> 50 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 44 0 R /K null /NS 13 0 R >> endobj 50 0 obj -<< /Type /StructElem /S /math /P 49 0 R /K [51 0 R 52 0 R 53 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 65 0 R /K [<> 51 0 R] /NS 13 0 R >> endobj 51 0 obj -<< /Type /StructElem /S /mi /P 50 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /math /P 50 0 R /K [52 0 R 53 0 R 54 0 R] /NS 13 0 R >> endobj 52 0 obj -<< /Type /StructElem /S /mo /P 50 0 R /K <> /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 51 0 R /K <> /NS 13 0 R >> endobj 53 0 obj -<< /Type /StructElem /S /mi /P 50 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 51 0 R /K <> /A 48 0 R /NS 13 0 R >> endobj 54 0 obj -<< /Type /StructElem /S /mtext /K [ 55 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 51 0 R /K <> /NS 13 0 R >> endobj 55 0 obj -<< /Type /StructElem /S /math /P 54 0 R /K [56 0 R 57 0 R 58 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K [ 56 0 R] /NS 13 0 R >> endobj 56 0 obj -<< /Type /StructElem /S /mi /P 55 0 R /K null /NS 13 0 R >> +<< /Type /StructElem /S /math /P 55 0 R /K [57 0 R 58 0 R 59 0 R] /NS 13 0 R >> endobj 57 0 obj -<< /Type /StructElem /S /mo /P 55 0 R /K null /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 56 0 R /K null /NS 13 0 R >> endobj 58 0 obj -<< /Type /StructElem /S /mi /P 55 0 R /K null /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 56 0 R /K null /A 48 0 R /NS 13 0 R >> endobj 59 0 obj -<< /Type /StructElem /S /mtext /K [ 60 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 56 0 R /K null /NS 13 0 R >> endobj 60 0 obj -<< /Type /StructElem /S /math /P 59 0 R /K [61 0 R 62 0 R 63 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K [ 61 0 R] /NS 13 0 R >> endobj 61 0 obj -<< /Type /StructElem /S /mi /P 60 0 R /K null /NS 13 0 R >> +<< /Type /StructElem /S /math /P 60 0 R /K [62 0 R 63 0 R 64 0 R] /NS 13 0 R >> endobj 62 0 obj -<< /Type /StructElem /S /mo /P 60 0 R /K null /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 61 0 R /K null /NS 13 0 R >> endobj 63 0 obj -<< /Type /StructElem /S /mi /P 60 0 R /K null /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 61 0 R /K null /A 48 0 R /NS 13 0 R >> endobj 64 0 obj -<< /Type /StructElem /S /mtd /P 95 0 R /K [49 0 R 65 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 61 0 R /K null /NS 13 0 R >> endobj 65 0 obj -<< /Type /StructElem /S /mi /P 64 0 R /A 66 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 96 0 R /K [50 0 R 66 0 R] /NS 13 0 R >> endobj -67 0 obj -<< /Type /StructElem /S /mtd /P 96 0 R /K 68 0 R /NS 13 0 R >> +66 0 obj +<< /Type /StructElem /S /mi /P 65 0 R /A 67 0 R /NS 13 0 R >> endobj 68 0 obj -<< /Type /StructElem /S /mn /P 67 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 97 0 R /K 69 0 R /NS 13 0 R >> endobj 69 0 obj -<< /Type /StructElem /S /mtext /K null /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 68 0 R /K <> /NS 13 0 R >> endobj 70 0 obj -<< /Type /StructElem /S /mtext /P 73 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K null /NS 13 0 R >> endobj 71 0 obj -<< /Type /StructElem /S /mtext /K null /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 74 0 R /K <> /NS 13 0 R >> endobj 72 0 obj << /Type /StructElem /S /mtext /K null /NS 13 0 R >> endobj 73 0 obj -<< /Type /StructElem /S /mtd /P 96 0 R /K [70 0 R 74 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K null /NS 13 0 R >> endobj 74 0 obj -<< /Type /StructElem /S /mi /P 73 0 R /A 66 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 97 0 R /K [71 0 R 75 0 R] /NS 13 0 R >> endobj 75 0 obj -<< /Type /StructElem /S /math /P 20 0 R /K [77 0 R 90 0 R 91 0 R] /A 76 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 74 0 R /A 67 0 R /NS 13 0 R >> endobj -77 0 obj -<< /Type /StructElem /S /mrow /P 75 0 R /K [78 0 R 80 0 R 82 0 R 88 0 R 89 0 R] /NS 13 0 R >> +76 0 obj +<< /Type /StructElem /S /math /P 21 0 R /K [78 0 R 91 0 R 92 0 R] /A 77 0 R /NS 13 0 R >> endobj 78 0 obj -<< /Type /StructElem /S /mo /P 77 0 R /K <> /A 79 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 76 0 R /K [79 0 R 81 0 R 83 0 R 89 0 R 90 0 R] /NS 13 0 R >> endobj -80 0 obj -<< /Type /StructElem /S /mspace /P 77 0 R /A 81 0 R /NS 13 0 R >> +79 0 obj +<< /Type /StructElem /S /mo /P 78 0 R /K <> /A 80 0 R /ActualText /NS 13 0 R >> endobj -82 0 obj -<< /Type /StructElem /S /mpadded /P 77 0 R /K 84 0 R /A 83 0 R /NS 13 0 R >> +81 0 obj +<< /Type /StructElem /S /mspace /P 78 0 R /A 82 0 R /NS 13 0 R >> endobj -84 0 obj -<< /Type /StructElem /S /mtable /P 82 0 R /K [85 0 R 86 0 R 87 0 R] /NS 13 0 R >> +83 0 obj +<< /Type /StructElem /S /mpadded /P 78 0 R /K 85 0 R /A 84 0 R /NS 13 0 R >> endobj 85 0 obj -<< /Type /StructElem /S /mtr /P 84 0 R /K [21 0 R 23 0 R 25 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtable /P 83 0 R /K [86 0 R 87 0 R 88 0 R] /NS 13 0 R >> endobj 86 0 obj -<< /Type /StructElem /S /mtr /P 84 0 R /K [27 0 R 29 0 R 31 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtr /P 85 0 R /K [22 0 R 24 0 R 26 0 R] /NS 13 0 R >> endobj 87 0 obj -<< /Type /StructElem /S /mtr /P 84 0 R /K [33 0 R 35 0 R 37 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtr /P 85 0 R /K [28 0 R 30 0 R 32 0 R] /NS 13 0 R >> endobj 88 0 obj -<< /Type /StructElem /S /mspace /P 77 0 R /A 81 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtr /P 85 0 R /K [34 0 R 36 0 R 38 0 R] /NS 13 0 R >> endobj 89 0 obj -<< /Type /StructElem /S /mo /P 77 0 R /K <> /A 79 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mspace /P 78 0 R /A 82 0 R /NS 13 0 R >> endobj 90 0 obj -<< /Type /StructElem /S /mo /P 75 0 R /K <> /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 78 0 R /K <> /A 80 0 R /ActualText /NS 13 0 R >> endobj 91 0 obj -<< /Type /StructElem /S /mrow /P 75 0 R /K [92 0 R 93 0 R 97 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 76 0 R /K <> /A 48 0 R /NS 13 0 R >> endobj 92 0 obj -<< /Type /StructElem /S /mo /P 91 0 R /K <> /A 79 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 76 0 R /K [93 0 R 94 0 R 98 0 R] /NS 13 0 R >> endobj 93 0 obj -<< /Type /StructElem /S /mpadded /P 91 0 R /K 94 0 R /A 83 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 92 0 R /K <> /A 80 0 R /ActualText /NS 13 0 R >> endobj 94 0 obj -<< /Type /StructElem /S /mtable /P 93 0 R /K [95 0 R 96 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mpadded /P 92 0 R /K 95 0 R /A 84 0 R /NS 13 0 R >> endobj 95 0 obj -<< /Type /StructElem /S /mtr /P 94 0 R /K [39 0 R 64 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtable /P 94 0 R /K [96 0 R 97 0 R] /NS 13 0 R >> endobj 96 0 obj -<< /Type /StructElem /S /mtr /P 94 0 R /K [67 0 R 73 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtr /P 95 0 R /K [40 0 R 65 0 R] /NS 13 0 R >> endobj 97 0 obj -<< /Type /StructElem /S /mspace /P 91 0 R /A 98 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtr /P 95 0 R /K [68 0 R 74 0 R] /NS 13 0 R >> endobj -101 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 102 0 R /AF [100 0 R] /NS 11 0 R >> +98 0 obj +<< /Type /StructElem /S /mspace /P 92 0 R /A 99 0 R /NS 13 0 R >> endobj 102 0 obj -<< /Type /StructElem /S /math /P 101 0 R /K [103 0 R 104 0 R 105 0 R 124 0 R] /A 76 0 R /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 18 0 R /K 103 0 R /AF [101 0 R] /NS 11 0 R >> endobj 103 0 obj -<< /Type /StructElem /S /mi /P 102 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /math /P 102 0 R /K [104 0 R 105 0 R 106 0 R 125 0 R] /A 77 0 R /NS 13 0 R >> endobj 104 0 obj -<< /Type /StructElem /S /mo /P 102 0 R /K <> /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 103 0 R /K <> /NS 13 0 R >> endobj 105 0 obj -<< /Type /StructElem /S /mfrac /P 102 0 R /K [106 0 R 121 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 103 0 R /K <> /A 48 0 R /NS 13 0 R >> endobj 106 0 obj -<< /Type /StructElem /S /mrow /P 105 0 R /K [107 0 R 109 0 R 110 0 R 112 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mfrac /P 103 0 R /K [107 0 R 122 0 R] /NS 13 0 R >> endobj 107 0 obj -<< /Type /StructElem /S /mo /P 106 0 R /K <> /A 108 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 106 0 R /K [108 0 R 110 0 R 111 0 R 113 0 R] /NS 13 0 R >> endobj -109 0 obj -<< /Type /StructElem /S /mi /P 106 0 R /K <> /NS 13 0 R >> +108 0 obj +<< /Type /StructElem /S /mo /P 107 0 R /K <> /A 109 0 R /NS 13 0 R >> endobj 110 0 obj -<< /Type /StructElem /S /mo /P 106 0 R /K <> /A 111 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 107 0 R /K <> /NS 13 0 R >> endobj -112 0 obj -<< /Type /StructElem /S /msqrt /P 106 0 R /K 113 0 R /NS 13 0 R >> +111 0 obj +<< /Type /StructElem /S /mo /P 107 0 R /K <> /A 112 0 R /NS 13 0 R >> endobj 113 0 obj -<< /Type /StructElem /S /mrow /P 112 0 R /K [114 0 R 117 0 R 118 0 R 119 0 R 120 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /msqrt /P 107 0 R /K 114 0 R /NS 13 0 R >> endobj 114 0 obj -<< /Type /StructElem /S /msup /P 113 0 R /K [115 0 R 116 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 113 0 R /K [115 0 R 118 0 R 119 0 R 120 0 R 121 0 R] /NS 13 0 R >> endobj 115 0 obj -<< /Type /StructElem /S /mi /P 114 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /msup /P 114 0 R /K [116 0 R 117 0 R] /NS 13 0 R >> endobj 116 0 obj -<< /Type /StructElem /S /mn /P 114 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 115 0 R /K <> /NS 13 0 R >> endobj 117 0 obj -<< /Type /StructElem /S /mo /P 113 0 R /K <> /A 111 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 115 0 R /K <> /NS 13 0 R >> endobj 118 0 obj -<< /Type /StructElem /S /mn /P 113 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 114 0 R /K <> /A 112 0 R /NS 13 0 R >> endobj 119 0 obj -<< /Type /StructElem /S /mi /P 113 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 114 0 R /K <> /NS 13 0 R >> endobj 120 0 obj -<< /Type /StructElem /S /mi /P 113 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 114 0 R /K <> /NS 13 0 R >> endobj 121 0 obj -<< /Type /StructElem /S /mrow /P 105 0 R /K [122 0 R 123 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 114 0 R /K <> /NS 13 0 R >> endobj 122 0 obj -<< /Type /StructElem /S /mn /P 121 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 106 0 R /K [123 0 R 124 0 R] /NS 13 0 R >> endobj 123 0 obj -<< /Type /StructElem /S /mi /P 121 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 122 0 R /K <> /NS 13 0 R >> endobj 124 0 obj -<< /Type /StructElem /S /mo /P 102 0 R /K <> /A 125 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 122 0 R /K <> /NS 13 0 R >> endobj -128 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 129 0 R /AF [127 0 R] /NS 11 0 R >> +125 0 obj +<< /Type /StructElem /S /mo /P 103 0 R /K <> /A 126 0 R /NS 13 0 R >> endobj 129 0 obj -<< /Type /StructElem /S /math /P 128 0 R /K [130 0 R 134 0 R 137 0 R 141 0 R] /A 76 0 R /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 18 0 R /K 130 0 R /AF [128 0 R] /NS 11 0 R >> endobj 130 0 obj -<< /Type /StructElem /S /munder /P 129 0 R /K [131 0 R 133 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /math /P 129 0 R /K [131 0 R 135 0 R 138 0 R 142 0 R] /A 77 0 R /NS 13 0 R >> endobj 131 0 obj -<< /Type /StructElem /S /mo /P 130 0 R /K <> /A 132 0 R /NS 13 0 R >> +<< /Type /StructElem /S /munder /P 130 0 R /K [132 0 R 134 0 R] /NS 13 0 R >> endobj -133 0 obj -<< /Type /StructElem /S /mi /P 130 0 R /K <> /NS 13 0 R >> +132 0 obj +<< /Type /StructElem /S /mo /P 131 0 R /K <> /A 133 0 R /NS 13 0 R >> endobj 134 0 obj -<< /Type /StructElem /S /munder /P 129 0 R /K [135 0 R 136 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 131 0 R /K <> /NS 13 0 R >> endobj 135 0 obj -<< /Type /StructElem /S /mi /P 134 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /munder /P 130 0 R /K [136 0 R 137 0 R] /NS 13 0 R >> endobj 136 0 obj -<< /Type /StructElem /S /mo /P 134 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 135 0 R /K <> /NS 13 0 R >> endobj 137 0 obj -<< /Type /StructElem /S /mover /P 129 0 R /K [138 0 R 139 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 135 0 R /NS 13 0 R >> endobj 138 0 obj -<< /Type /StructElem /S /mi /P 137 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mover /P 130 0 R /K [139 0 R 140 0 R] /NS 13 0 R >> endobj 139 0 obj -<< /Type /StructElem /S /mo /P 137 0 R /K <> /A 140 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 138 0 R /K <> /NS 13 0 R >> endobj -141 0 obj -<< /Type /StructElem /S /msup /P 129 0 R /K [142 0 R 143 0 R] /NS 13 0 R >> +140 0 obj +<< /Type /StructElem /S /mo /P 138 0 R /K <> /A 141 0 R /ActualText /NS 13 0 R >> endobj 142 0 obj -<< /Type /StructElem /S /mi /P 141 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /msup /P 130 0 R /K [143 0 R 144 0 R] /NS 13 0 R >> endobj 143 0 obj -<< /Type /StructElem /S /mi /P 141 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 142 0 R /K <> /NS 13 0 R >> endobj -147 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 193 0 R /AF [146 0 R] /NS 11 0 R >> +144 0 obj +<< /Type /StructElem /S /mi /P 142 0 R /K <> /A 145 0 R /NS 13 0 R >> endobj 148 0 obj -<< /Type /StructElem /S /mtd /P 196 0 R /K [149 0 R 150 0 R 151 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 18 0 R /K 194 0 R /AF [147 0 R] /NS 11 0 R >> endobj 149 0 obj -<< /Type /StructElem /S /mi /P 148 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 197 0 R /K [150 0 R 151 0 R 152 0 R] /NS 13 0 R >> endobj 150 0 obj -<< /Type /StructElem /S /mi /P 148 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 149 0 R /K <> /NS 13 0 R >> endobj 151 0 obj -<< /Type /StructElem /S /mi /P 148 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 149 0 R /K <> /NS 13 0 R >> endobj 152 0 obj -<< /Type /StructElem /S /mtd /P 196 0 R /K [153 0 R 154 0 R 155 0 R 156 0 R 157 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 149 0 R /K <> /NS 13 0 R >> endobj 153 0 obj -<< /Type /StructElem /S /mi /P 152 0 R /A 66 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 197 0 R /K [154 0 R 155 0 R 156 0 R 157 0 R 158 0 R] /NS 13 0 R >> endobj 154 0 obj -<< /Type /StructElem /S /mo /P 152 0 R /K <> /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 153 0 R /A 67 0 R /NS 13 0 R >> endobj 155 0 obj -<< /Type /StructElem /S /mi /P 152 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 153 0 R /K <> /A 48 0 R /NS 13 0 R >> endobj 156 0 obj -<< /Type /StructElem /S /mi /P 152 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 153 0 R /K <> /NS 13 0 R >> endobj 157 0 obj -<< /Type /StructElem /S /mi /P 152 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 153 0 R /K <> /NS 13 0 R >> endobj 158 0 obj -<< /Type /StructElem /S /mtd /P 196 0 R /K 159 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 153 0 R /K <> /NS 13 0 R >> endobj 159 0 obj -<< /Type /StructElem /S /msup /P 158 0 R /K [160 0 R 161 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 197 0 R /K 160 0 R /NS 13 0 R >> endobj 160 0 obj -<< /Type /StructElem /S /mi /P 159 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /msup /P 159 0 R /K [161 0 R 162 0 R] /NS 13 0 R >> endobj 161 0 obj -<< /Type /StructElem /S /mrow /P 159 0 R /K [162 0 R 163 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 160 0 R /K <> /NS 13 0 R >> endobj 162 0 obj -<< /Type /StructElem /S /mi /P 161 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 160 0 R /K [163 0 R 164 0 R] /NS 13 0 R >> endobj 163 0 obj -<< /Type /StructElem /S /mi /P 161 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 162 0 R /K <> /A 145 0 R /NS 13 0 R >> endobj 164 0 obj -<< /Type /StructElem /S /mtd /P 196 0 R /K [165 0 R 166 0 R 168 0 R 169 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 162 0 R /K <> /NS 13 0 R >> endobj 165 0 obj -<< /Type /StructElem /S /mi /P 164 0 R /A 66 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 197 0 R /K [166 0 R 167 0 R 169 0 R 170 0 R] /NS 13 0 R >> endobj 166 0 obj -<< /Type /StructElem /S /mo /P 164 0 R /K <> /A 167 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 165 0 R /A 67 0 R /NS 13 0 R >> endobj -168 0 obj -<< /Type /StructElem /S /mo /P 164 0 R /K <> /A 167 0 R /NS 13 0 R >> +167 0 obj +<< /Type /StructElem /S /mo /P 165 0 R /K <> /A 168 0 R /NS 13 0 R >> endobj 169 0 obj -<< /Type /StructElem /S /mn /P 164 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 165 0 R /K <> /A 168 0 R /NS 13 0 R >> endobj 170 0 obj -<< /Type /StructElem /S /mtd /P 199 0 R /K [171 0 R 173 0 R 174 0 R 175 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 165 0 R /K <> /NS 13 0 R >> endobj 171 0 obj -<< /Type /StructElem /S /mo /P 170 0 R /K <> /A 172 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 200 0 R /K [172 0 R 174 0 R 175 0 R 176 0 R] /NS 13 0 R >> endobj -173 0 obj -<< /Type /StructElem /S /mn /P 170 0 R /K <> /NS 13 0 R >> +172 0 obj +<< /Type /StructElem /S /mo /P 171 0 R /K <> /A 173 0 R /ActualText /NS 13 0 R >> endobj 174 0 obj -<< /Type /StructElem /S /mo /P 170 0 R /K <> /A 111 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 171 0 R /K <> /NS 13 0 R >> endobj 175 0 obj -<< /Type /StructElem /S /mn /P 170 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 171 0 R /K <> /A 112 0 R /NS 13 0 R >> endobj 176 0 obj -<< /Type /StructElem /S /mtd /P 199 0 R /K [177 0 R 178 0 R 179 0 R 180 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 171 0 R /K <> /NS 13 0 R >> endobj 177 0 obj -<< /Type /StructElem /S /mi /P 176 0 R /A 66 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 200 0 R /K [178 0 R 179 0 R 180 0 R 181 0 R] /NS 13 0 R >> endobj 178 0 obj -<< /Type /StructElem /S /mo /P 176 0 R /K <> /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 177 0 R /A 67 0 R /NS 13 0 R >> endobj 179 0 obj -<< /Type /StructElem /S /mn /P 176 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 177 0 R /K <> /A 48 0 R /NS 13 0 R >> endobj 180 0 obj -<< /Type /StructElem /S /mo /P 176 0 R /K <> /A 172 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 177 0 R /K <> /NS 13 0 R >> endobj 181 0 obj -<< /Type /StructElem /S /mtd /P 199 0 R /K 182 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 177 0 R /K <> /A 173 0 R /ActualText /NS 13 0 R >> endobj 182 0 obj -<< /Type /StructElem /S /mi /P 181 0 R /A 66 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 200 0 R /K 183 0 R /NS 13 0 R >> endobj 183 0 obj -<< /Type /StructElem /S /mtd /P 199 0 R /K 184 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 182 0 R /A 67 0 R /NS 13 0 R >> endobj 184 0 obj -<< /Type /StructElem /S /mi /P 183 0 R /A 66 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 200 0 R /K 185 0 R /NS 13 0 R >> endobj 185 0 obj -<< /Type /StructElem /S /mtd /P 202 0 R /K 186 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 184 0 R /A 67 0 R /NS 13 0 R >> endobj 186 0 obj -<< /Type /StructElem /S /mn /P 185 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 203 0 R /K 187 0 R /NS 13 0 R >> endobj 187 0 obj -<< /Type /StructElem /S /mtd /P 202 0 R /K 188 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 186 0 R /K <> /NS 13 0 R >> endobj 188 0 obj -<< /Type /StructElem /S /mi /P 187 0 R /A 66 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 203 0 R /K 189 0 R /NS 13 0 R >> endobj 189 0 obj -<< /Type /StructElem /S /mtd /P 202 0 R /K 190 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 188 0 R /A 67 0 R /NS 13 0 R >> endobj 190 0 obj -<< /Type /StructElem /S /mi /P 189 0 R /A 66 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 203 0 R /K 191 0 R /NS 13 0 R >> endobj 191 0 obj -<< /Type /StructElem /S /mtd /P 202 0 R /K 192 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 190 0 R /A 67 0 R /NS 13 0 R >> endobj 192 0 obj -<< /Type /StructElem /S /mi /P 191 0 R /A 66 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 203 0 R /K 193 0 R /NS 13 0 R >> endobj 193 0 obj -<< /Type /StructElem /S /math /P 147 0 R /K 194 0 R /A 76 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 192 0 R /A 67 0 R /NS 13 0 R >> endobj 194 0 obj -<< /Type /StructElem /S /mtable /P 193 0 R /K [196 0 R 199 0 R 202 0 R] /A 195 0 R /NS 13 0 R >> +<< /Type /StructElem /S /math /P 148 0 R /K 195 0 R /A 77 0 R /NS 13 0 R >> endobj -196 0 obj -<< /Type /StructElem /S /mlabeledtr /P 194 0 R /K [197 0 R 148 0 R 152 0 R 158 0 R 164 0 R] /NS 13 0 R >> +195 0 obj +<< /Type /StructElem /S /mtable /P 194 0 R /K [197 0 R 200 0 R 203 0 R] /A 196 0 R /NS 13 0 R >> endobj 197 0 obj -<< /Type /StructElem /S /mtd /P 196 0 R /K 198 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mlabeledtr /P 195 0 R /K [198 0 R 149 0 R 153 0 R 159 0 R 165 0 R] /NS 13 0 R >> endobj 198 0 obj -<< /Type /StructElem /S /mtext /P 197 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 197 0 R /K 199 0 R /NS 13 0 R >> endobj 199 0 obj -<< /Type /StructElem /S /mlabeledtr /P 194 0 R /K [200 0 R 170 0 R 176 0 R 181 0 R 183 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 198 0 R /NS 13 0 R >> endobj 200 0 obj -<< /Type /StructElem /S /mtd /P 199 0 R /K 201 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mlabeledtr /P 195 0 R /K [201 0 R 171 0 R 177 0 R 182 0 R 184 0 R] /NS 13 0 R >> endobj 201 0 obj -<< /Type /StructElem /S /mtext /P 200 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 200 0 R /K 202 0 R /NS 13 0 R >> endobj 202 0 obj -<< /Type /StructElem /S /mlabeledtr /P 194 0 R /K [203 0 R 185 0 R 187 0 R 189 0 R 191 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 201 0 R /NS 13 0 R >> endobj 203 0 obj -<< /Type /StructElem /S /mtd /P 202 0 R /K 204 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mlabeledtr /P 195 0 R /K [204 0 R 186 0 R 188 0 R 190 0 R 192 0 R] /NS 13 0 R >> endobj 204 0 obj -<< /Type /StructElem /S /mtext /P 203 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 203 0 R /K 205 0 R /NS 13 0 R >> endobj -207 0 obj -<< /Type /StructElem /S /Formula /P 17 0 R /K 208 0 R /AF [206 0 R] /NS 11 0 R >> +205 0 obj +<< /Type /StructElem /S /mtext /P 204 0 R /NS 13 0 R >> endobj 208 0 obj -<< /Type /StructElem /S /math /P 207 0 R /K [209 0 R 213 0 R 215 0 R 216 0 R 217 0 R 218 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 18 0 R /K 209 0 R /AF [207 0 R] /NS 11 0 R >> endobj 209 0 obj -<< /Type /StructElem /S /mrow /P 208 0 R /K [210 0 R 211 0 R 212 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /math /P 208 0 R /K [210 0 R 214 0 R 216 0 R 217 0 R 218 0 R 219 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R] /NS 13 0 R >> endobj 210 0 obj -<< /Type /StructElem /S /mi /P 209 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 209 0 R /K [211 0 R 212 0 R 213 0 R] /NS 13 0 R >> endobj 211 0 obj -<< /Type /StructElem /S /mi /P 209 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 210 0 R /K <> /A 145 0 R /NS 13 0 R >> endobj 212 0 obj -<< /Type /StructElem /S /mi /P 209 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 210 0 R /K <> /A 145 0 R /NS 13 0 R >> endobj 213 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 210 0 R /K <> /A 145 0 R /NS 13 0 R >> endobj -215 0 obj -<< /Type /StructElem /S /mi /P 208 0 R /K <> /NS 13 0 R >> +214 0 obj +<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 215 0 R /NS 13 0 R >> endobj 216 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 209 0 R /K <> /NS 13 0 R >> endobj 217 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 111 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 215 0 R /NS 13 0 R >> endobj 218 0 obj -<< /Type /StructElem /S /mrow /P 208 0 R /K [219 0 R 220 0 R 221 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 112 0 R /NS 13 0 R >> endobj 219 0 obj -<< /Type /StructElem /S /mi /P 218 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 209 0 R /K [220 0 R 221 0 R 222 0 R] /NS 13 0 R >> endobj 220 0 obj -<< /Type /StructElem /S /mi /P 218 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 219 0 R /K <> /A 145 0 R /NS 13 0 R >> endobj 221 0 obj -<< /Type /StructElem /S /mi /P 218 0 R /K <> /A 144 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 219 0 R /K <> /A 145 0 R /NS 13 0 R >> endobj 222 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 219 0 R /K <> /A 145 0 R /NS 13 0 R >> endobj 223 0 obj -<< /Type /StructElem /S /mi /P 208 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 215 0 R /NS 13 0 R >> endobj 224 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 111 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 209 0 R /K <> /NS 13 0 R >> endobj 225 0 obj -<< /Type /StructElem /S /mn /P 208 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 112 0 R /NS 13 0 R >> endobj 226 0 obj -<< /Type /StructElem /S /mi /P 208 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 209 0 R /K <> /NS 13 0 R >> endobj 227 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 214 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 209 0 R /K <> /NS 13 0 R >> endobj 228 0 obj -<< /Type /StructElem /S /mo /P 208 0 R /K <> /A 47 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 215 0 R /NS 13 0 R >> endobj 229 0 obj -<< /Type /StructElem /S /mn /P 208 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 48 0 R /NS 13 0 R >> +endobj +230 0 obj +<< /Type /StructElem /S /mn /P 209 0 R /K <> /NS 13 0 R >> endobj 5 0 obj << /Type /StructTreeRoot /K 17 0 R /ParentTree 6 0 R /RoleMap 7 0 R /Namespaces 8 0 R >> endobj -241 0 obj +242 0 obj [ 66 [ 323 ] ] endobj -243 0 obj +244 0 obj << /Subtype /CIDFontType0C /Length 592 >> [BINARY STREAM] endobj -242 0 obj -<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 243 0 R >> +243 0 obj +<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 244 0 R >> endobj -244 0 obj +245 0 obj << /Length 687 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1545,23 +1548,23 @@ end %%EOF endstream endobj -238 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 245 0 R ] /ToUnicode 244 0 R >> -endobj -245 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 242 0 R /W 241 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +239 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 246 0 R ] /ToUnicode 245 0 R >> endobj 246 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 243 0 R /W 242 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +247 0 obj [ 1013 [ 569 ] 1404 [ 620 ] 2981 [ 407 ] 4558 [ 668 ] ] endobj -248 0 obj +249 0 obj << /Subtype /CIDFontType0C /Length 1102 >> [BINARY STREAM] endobj -247 0 obj -<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 248 0 R >> +248 0 obj +<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 249 0 R >> endobj -249 0 obj +250 0 obj << /Length 772 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1600,23 +1603,23 @@ end %%EOF endstream endobj -237 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 250 0 R ] /ToUnicode 249 0 R >> -endobj -250 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 247 0 R /W 246 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +238 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 251 0 R ] /ToUnicode 250 0 R >> endobj 251 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 248 0 R /W 247 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +252 0 obj [ 9 [ 389 389 ] 12 [ 778 ] 15 [ 278 ] 17 [ 500 500 500 500 500 500 ] 30 [ 778 ] 1296 [ 529 429 433 520 466 490 ] 1319 [ 572 ] 1790 [ 0 ] 2455 [ 663 663 ] 2503 [ 875 875 875 875 875 875 ] 2515 [ 902 ] 2615 [ 778 ] 2619 [ 778 ] 3074 [ 1444 ] 3077 [ 833 ] 4474 [ 570 ] ] endobj -253 0 obj +254 0 obj << /Subtype /CIDFontType0C /Length 4088 >> [BINARY STREAM] endobj -252 0 obj -<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 253 0 R >> +253 0 obj +<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 254 0 R >> endobj -254 0 obj +255 0 obj << /Length 1203 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1684,23 +1687,23 @@ end %%EOF endstream endobj -236 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 255 0 R ] /ToUnicode 254 0 R >> -endobj -255 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 252 0 R /W 251 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +237 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 256 0 R ] /ToUnicode 255 0 R >> endobj 256 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 253 0 R /W 252 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +257 0 obj [ 49 [ 681 444 ] 55 [ 306 ] 59 [ 500 ] 63 [ 556 ] 66 [ 278 ] 72 [ 278 ] 77 [ 556 ] 81 [ 500 500 ] 85 [ 389 389 ] 88 [ 278 ] 98 [ 394 ] 103 [ 333 ] 105 [ 389 500 500 ] ] endobj -258 0 obj +259 0 obj << /Subtype /CIDFontType0C /Length 2411 >> [BINARY STREAM] endobj -257 0 obj -<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 258 0 R >> +258 0 obj +<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 259 0 R >> endobj -259 0 obj +260 0 obj << /Length 931 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1753,288 +1756,289 @@ end %%EOF endstream endobj -235 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 260 0 R ] /ToUnicode 259 0 R >> -endobj -260 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 257 0 R /W 256 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> -endobj -239 0 obj -<< /Type /Pages /Count 1 /Kids [ 233 0 R ] >> +236 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 261 0 R ] /ToUnicode 260 0 R >> endobj 261 0 obj -<< /Type /Catalog /Pages 239 0 R /MarkInfo 240 0 R/Lang (en-US)/Metadata 231 0 R/StructTreeRoot 5 0 R >> +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 258 0 R /W 257 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +240 0 obj +<< /Type /Pages /Count 1 /Kids [ 234 0 R ] >> endobj 262 0 obj -<< /Producer (luahbtex-1.15.0)/Creator (LaTeX)/CreationDate (D:20221204074910+01'00')/ModDate (D:20221204074910+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.15.0 (TeX Live 2022)) >> +<< /Type /Catalog /Pages 240 0 R /MarkInfo 241 0 R/Lang (en-US)/Metadata 232 0 R/StructTreeRoot 5 0 R >> +endobj +263 0 obj +<< /Producer (LuaTeX)/Creator (TeX)/CreationDate (D:20010101205959-00'00')/ModDate (D:20010101205959-00'00') /Trapped /False >> endobj xref -0 263 +0 264 0000000002 65535 f -0000026222 00000 n +0000026225 00000 n 0000000003 00000 f 0000000004 00000 f 0000000010 00000 f -0000046626 00000 n -0000026306 00000 n -0000026969 00000 n -0000027297 00000 n -0000026991 00000 n +0000046715 00000 n +0000026309 00000 n +0000026972 00000 n +0000027300 00000 n +0000026994 00000 n 0000000012 00000 f -0000027059 00000 n +0000027062 00000 n 0000000014 00000 f -0000027129 00000 n +0000027132 00000 n 0000000016 00000 f -0000027210 00000 n +0000027213 00000 n 0000000000 00000 f -0000027344 00000 n -0000027470 00000 n -0000001940 00000 n -0000027578 00000 n -0000027676 00000 n -0000027757 00000 n -0000027866 00000 n -0000027947 00000 n -0000028056 00000 n -0000028137 00000 n -0000028246 00000 n -0000028327 00000 n -0000028436 00000 n -0000028517 00000 n -0000028626 00000 n -0000028707 00000 n -0000028816 00000 n -0000028897 00000 n -0000029006 00000 n -0000029087 00000 n -0000029196 00000 n -0000029277 00000 n -0000029387 00000 n -0000029468 00000 n -0000029578 00000 n -0000029654 00000 n -0000029736 00000 n +0000027347 00000 n +0000027432 00000 n +0000027559 00000 n +0000001941 00000 n +0000027667 00000 n +0000027765 00000 n +0000027846 00000 n +0000027955 00000 n +0000028036 00000 n +0000028145 00000 n +0000028226 00000 n +0000028335 00000 n +0000028416 00000 n +0000028525 00000 n +0000028606 00000 n +0000028715 00000 n +0000028796 00000 n +0000028905 00000 n +0000028986 00000 n +0000029095 00000 n +0000029176 00000 n +0000029285 00000 n +0000029366 00000 n +0000029476 00000 n +0000029557 00000 n +0000029667 00000 n +0000029743 00000 n +0000029825 00000 n 0000000020 00000 n -0000029847 00000 n -0000029925 00000 n -0000000093 00000 n +0000029936 00000 n 0000030014 00000 n -0000030092 00000 n -0000030214 00000 n -0000030312 00000 n -0000030422 00000 n -0000030543 00000 n -0000030653 00000 n -0000030729 00000 n -0000030827 00000 n -0000030905 00000 n +0000000093 00000 n +0000030103 00000 n +0000030181 00000 n +0000030303 00000 n +0000030401 00000 n +0000030511 00000 n +0000030632 00000 n +0000030742 00000 n +0000030818 00000 n +0000030916 00000 n 0000030994 00000 n -0000031072 00000 n -0000031148 00000 n -0000031246 00000 n -0000031324 00000 n +0000031083 00000 n +0000031161 00000 n +0000031237 00000 n +0000031335 00000 n 0000031413 00000 n -0000031491 00000 n -0000031581 00000 n +0000031502 00000 n +0000031580 00000 n +0000031670 00000 n 0000000164 00000 n -0000031662 00000 n -0000031743 00000 n -0000031853 00000 n -0000031924 00000 n -0000032037 00000 n -0000032108 00000 n -0000032179 00000 n -0000032269 00000 n -0000032350 00000 n +0000031751 00000 n +0000031832 00000 n +0000031942 00000 n +0000032013 00000 n +0000032126 00000 n +0000032197 00000 n +0000032268 00000 n +0000032358 00000 n +0000032439 00000 n 0000000219 00000 n -0000032459 00000 n -0000032571 00000 n +0000032548 00000 n +0000032660 00000 n 0000000273 00000 n -0000032714 00000 n +0000032803 00000 n 0000000360 00000 n -0000032799 00000 n +0000032888 00000 n 0000000415 00000 n -0000032895 00000 n -0000032995 00000 n -0000033092 00000 n -0000033189 00000 n -0000033286 00000 n -0000033371 00000 n -0000033515 00000 n -0000033636 00000 n -0000033734 00000 n -0000033878 00000 n -0000033974 00000 n -0000034067 00000 n -0000034157 00000 n -0000034247 00000 n +0000032984 00000 n +0000033084 00000 n +0000033181 00000 n +0000033278 00000 n +0000033375 00000 n +0000033460 00000 n +0000033604 00000 n +0000033725 00000 n +0000033823 00000 n +0000033967 00000 n +0000034063 00000 n +0000034156 00000 n +0000034246 00000 n +0000034336 00000 n 0000000487 00000 n 0000000541 00000 n -0000003009 00000 n -0000034332 00000 n -0000034433 00000 n -0000034555 00000 n -0000034667 00000 n -0000034790 00000 n -0000034886 00000 n -0000034997 00000 n -0000002118 00000 n -0000035121 00000 n -0000035233 00000 n -0000002184 00000 n -0000035357 00000 n -0000035443 00000 n -0000035562 00000 n -0000035657 00000 n -0000035769 00000 n -0000035881 00000 n -0000036005 00000 n -0000036117 00000 n -0000036229 00000 n -0000036341 00000 n -0000036436 00000 n -0000036548 00000 n -0000036660 00000 n -0000002256 00000 n -0000002316 00000 n -0000003879 00000 n -0000036784 00000 n -0000036885 00000 n -0000037007 00000 n -0000037104 00000 n -0000003190 00000 n -0000037228 00000 n -0000037340 00000 n -0000037437 00000 n -0000037549 00000 n -0000037621 00000 n -0000037717 00000 n -0000037829 00000 n -0000003276 00000 n -0000037976 00000 n -0000038071 00000 n -0000038183 00000 n -0000003331 00000 n -0000003391 00000 n -0000005868 00000 n -0000038307 00000 n -0000038408 00000 n -0000038510 00000 n -0000038622 00000 n -0000038734 00000 n -0000038846 00000 n -0000038964 00000 n -0000039047 00000 n -0000039170 00000 n -0000039282 00000 n -0000039394 00000 n -0000039506 00000 n -0000039590 00000 n -0000039685 00000 n -0000039797 00000 n -0000039892 00000 n -0000040016 00000 n -0000040128 00000 n -0000040238 00000 n -0000040321 00000 n -0000004060 00000 n -0000040445 00000 n -0000040569 00000 n -0000040681 00000 n -0000040791 00000 n -0000004126 00000 n -0000040938 00000 n -0000041050 00000 n -0000041174 00000 n -0000041286 00000 n -0000041396 00000 n -0000041479 00000 n -0000041602 00000 n -0000041714 00000 n -0000041861 00000 n -0000041945 00000 n -0000042028 00000 n -0000042112 00000 n -0000042195 00000 n -0000042279 00000 n -0000042391 00000 n -0000042475 00000 n -0000042558 00000 n -0000042642 00000 n -0000042725 00000 n -0000042809 00000 n -0000042892 00000 n -0000042988 00000 n -0000004250 00000 n -0000043105 00000 n -0000043230 00000 n -0000043314 00000 n -0000043389 00000 n -0000043514 00000 n -0000043598 00000 n -0000043673 00000 n -0000043798 00000 n -0000043882 00000 n -0000004368 00000 n -0000007180 00000 n -0000043957 00000 n -0000044058 00000 n -0000044249 00000 n -0000044352 00000 n -0000044476 00000 n -0000044600 00000 n -0000044724 00000 n -0000006049 00000 n -0000044848 00000 n -0000044960 00000 n -0000045084 00000 n -0000045208 00000 n -0000045311 00000 n -0000045435 00000 n -0000045559 00000 n -0000045683 00000 n -0000045807 00000 n -0000045919 00000 n -0000046043 00000 n -0000046155 00000 n -0000046267 00000 n -0000046391 00000 n -0000046514 00000 n -0000006125 00000 n -0000007361 00000 n -0000026118 00000 n -0000025979 00000 n -0000017743 00000 n -0000061686 00000 n -0000057417 00000 n -0000051093 00000 n -0000048411 00000 n -0000062046 00000 n -0000026269 00000 n -0000046731 00000 n -0000047440 00000 n -0000046763 00000 n -0000047663 00000 n -0000048567 00000 n -0000048769 00000 n -0000050029 00000 n -0000048842 00000 n -0000050260 00000 n -0000051256 00000 n -0000051465 00000 n -0000055923 00000 n -0000051750 00000 n -0000056153 00000 n -0000057580 00000 n -0000057789 00000 n -0000060471 00000 n -0000057975 00000 n -0000060694 00000 n -0000061843 00000 n -0000062110 00000 n -0000062232 00000 n +0000003012 00000 n +0000034421 00000 n +0000034522 00000 n +0000034644 00000 n +0000034756 00000 n +0000034879 00000 n +0000034975 00000 n +0000035086 00000 n +0000002121 00000 n +0000035210 00000 n +0000035322 00000 n +0000002187 00000 n +0000035446 00000 n +0000035532 00000 n +0000035651 00000 n +0000035746 00000 n +0000035858 00000 n +0000035970 00000 n +0000036094 00000 n +0000036206 00000 n +0000036318 00000 n +0000036430 00000 n +0000036525 00000 n +0000036637 00000 n +0000036749 00000 n +0000002259 00000 n +0000002319 00000 n +0000003882 00000 n +0000036873 00000 n +0000036974 00000 n +0000037096 00000 n +0000037193 00000 n +0000003193 00000 n +0000037317 00000 n +0000037429 00000 n +0000037526 00000 n +0000037638 00000 n +0000037710 00000 n +0000037806 00000 n +0000037918 00000 n +0000003279 00000 n +0000038065 00000 n +0000038160 00000 n +0000038272 00000 n +0000003334 00000 n +0000003394 00000 n +0000005871 00000 n +0000038396 00000 n +0000038497 00000 n +0000038599 00000 n +0000038711 00000 n +0000038823 00000 n +0000038935 00000 n +0000039053 00000 n +0000039136 00000 n +0000039259 00000 n +0000039371 00000 n +0000039483 00000 n +0000039595 00000 n +0000039679 00000 n +0000039774 00000 n +0000039886 00000 n +0000039981 00000 n +0000040105 00000 n +0000040217 00000 n +0000040327 00000 n +0000040410 00000 n +0000004063 00000 n +0000040534 00000 n +0000040658 00000 n +0000040770 00000 n +0000040880 00000 n +0000004129 00000 n +0000041027 00000 n +0000041139 00000 n +0000041263 00000 n +0000041375 00000 n +0000041485 00000 n +0000041568 00000 n +0000041691 00000 n +0000041803 00000 n +0000041950 00000 n +0000042034 00000 n +0000042117 00000 n +0000042201 00000 n +0000042284 00000 n +0000042368 00000 n +0000042480 00000 n +0000042564 00000 n +0000042647 00000 n +0000042731 00000 n +0000042814 00000 n +0000042898 00000 n +0000042981 00000 n +0000043077 00000 n +0000004253 00000 n +0000043194 00000 n +0000043319 00000 n +0000043403 00000 n +0000043478 00000 n +0000043603 00000 n +0000043687 00000 n +0000043762 00000 n +0000043887 00000 n +0000043971 00000 n +0000004371 00000 n +0000007183 00000 n +0000044046 00000 n +0000044147 00000 n +0000044338 00000 n +0000044441 00000 n +0000044565 00000 n +0000044689 00000 n +0000044813 00000 n +0000006052 00000 n +0000044937 00000 n +0000045049 00000 n +0000045173 00000 n +0000045297 00000 n +0000045400 00000 n +0000045524 00000 n +0000045648 00000 n +0000045772 00000 n +0000045896 00000 n +0000046008 00000 n +0000046132 00000 n +0000046244 00000 n +0000046356 00000 n +0000046480 00000 n +0000046603 00000 n +0000006128 00000 n +0000007364 00000 n +0000026121 00000 n +0000025982 00000 n +0000017746 00000 n +0000061775 00000 n +0000057506 00000 n +0000051182 00000 n +0000048500 00000 n +0000062135 00000 n +0000026272 00000 n +0000046820 00000 n +0000047529 00000 n +0000046852 00000 n +0000047752 00000 n +0000048656 00000 n +0000048858 00000 n +0000050118 00000 n +0000048931 00000 n +0000050349 00000 n +0000051345 00000 n +0000051554 00000 n +0000056012 00000 n +0000051839 00000 n +0000056242 00000 n +0000057669 00000 n +0000057878 00000 n +0000060560 00000 n +0000058064 00000 n +0000060783 00000 n +0000061932 00000 n +0000062199 00000 n +0000062321 00000 n trailer -<< /Size 263 /Root 261 0 R /Info 262 0 R /ID [ <4F23DD47C2CB1E4A823FC7CBBBCDBD14> <4F23DD47C2CB1E4A823FC7CBBBCDBD14> ] >> +<< /Size 264 /Root 262 0 R /Info 263 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> startxref -62460 +62466 %%EOF diff --git a/testfiles-lua/test_xml.mlt b/testfiles-lua/test_xml.mlt index 3c72240..ff1a82b 100644 --- a/testfiles-lua/test_xml.mlt +++ b/testfiles-lua/test_xml.mlt @@ -1,15 +1,11 @@ -\RequirePackage{pdfmanagement-testphase} -\DeclareDocumentMetadata{ +\DocumentMetadata{ uncompress, pdfversion = 2.0, + testphase = phase-I, } +\input{regression-test} \documentclass{article} \usepackage[l3build]{luamml-demo} -\usepackage{tagpdf} -\tagpdfsetup{ - activate-all, - interwordspace=true, -} \usepackage{unicode-math} From e83622cbae4b6abb333502de93c5e7ddbcb7b7f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 18 Mar 2023 00:01:27 +0100 Subject: [PATCH 095/206] Recreate tests --- testfiles-lua/test_struct.tpf | 1248 +++++++++++++++++---------------- 1 file changed, 644 insertions(+), 604 deletions(-) diff --git a/testfiles-lua/test_struct.tpf b/testfiles-lua/test_struct.tpf index 72ac197..71fe9cf 100644 --- a/testfiles-lua/test_struct.tpf +++ b/testfiles-lua/test_struct.tpf @@ -1,111 +1,111 @@ %PDF-2.0 %ฬีมิลุะฤฦ -45 0 obj -<< /O/NSO/NS 13 0 R/displaystyle(true)/scriptlevel(0) >> +50 0 obj +<< /O/NSO/NS 12 0 R/displaystyle(true)/scriptlevel(0) >> endobj -48 0 obj -<< /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0.278em) >> +53 0 obj +<< /O/NSO/NS 12 0 R/lspace(0.278em)/rspace(0.278em) >> endobj -67 0 obj -<< /O/NSO/NS 13 0 R/intent(@ignore) >> -endobj -77 0 obj -<< /O/NSO/NS 13 0 R/display(block) >> -endobj -80 0 obj -<< /O/NSO/NS 13 0 R/fence(true)/lspace(0)/rspace(0)/symmetric(true) >> +72 0 obj +<< /O/NSO/NS 12 0 R/intent(@ignore) >> endobj 82 0 obj -<< /O/NSO/NS 13 0 R/width(-4.981pt) >> +<< /O/NSO/NS 12 0 R/display(block) >> endobj -84 0 obj -<< /O/NSO/NS 13 0 R/lspace(+4.981pt)/width(+9.963pt) >> +85 0 obj +<< /O/NSO/NS 12 0 R/fence(true)/lspace(0)/rspace(0)/symmetric(true) >> endobj -99 0 obj -<< /O/NSO/NS 13 0 R/width(1.196pt) >> +87 0 obj +<< /O/NSO/NS 12 0 R/width(-4.981pt) >> endobj -100 0 obj +89 0 obj +<< /O/NSO/NS 12 0 R/lspace(+4.981pt)/width(+9.963pt) >> +endobj +104 0 obj +<< /O/NSO/NS 12 0 R/width(1.196pt) >> +endobj +105 0 obj <> stream (100010001)={1ifย ๐‘Ž=๐‘2else endstream endobj -20 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +25 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -109 0 obj -<< /O/NSO/NS 13 0 R/lspace(0)/rspace(0.222em) >> +114 0 obj +<< /O/NSO/NS 12 0 R/lspace(0)/rspace(0.222em) >> endobj -112 0 obj -<< /O/NSO/NS 13 0 R/lspace(0.222em)/rspace(0.222em) >> +117 0 obj +<< /O/NSO/NS 12 0 R/lspace(0.222em)/rspace(0.222em) >> endobj -126 0 obj -<< /O/NSO/NS 13 0 R/lspace(0)/rspace(0) >> +131 0 obj +<< /O/NSO/NS 12 0 R/lspace(0)/rspace(0) >> endobj -127 0 obj +132 0 obj <> stream ๐‘ฅ=โˆ’๐‘ยฑ๐‘2โˆ’4๐‘Ž๐‘2๐‘Ž. endstream endobj -101 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +106 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -133 0 obj -<< /O/NSO/NS 13 0 R/lspace(0)/movablelimits(true)/rspace(0.167em) >> -endobj -141 0 obj -<< /O/NSO/NS 13 0 R/stretchy(true) >> -endobj -145 0 obj -<< /O/NSO/NS 13 0 R/mathvariant(normal) >> +138 0 obj +<< /O/NSO/NS 12 0 R/lspace(0)/movablelimits(true)/rspace(0.167em) >> endobj 146 0 obj +<< /O/NSO/NS 12 0 R/stretchy(true) >> +endobj +150 0 obj +<< /O/NSO/NS 12 0 R/mathvariant(normal) >> +endobj +151 0 obj <> stream โˆ‘๐‘Ž๐‘_๐‘.๐‘โ€ฒ endstream endobj -128 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> -endobj -168 0 obj -<< /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0) >> +133 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj 173 0 obj -<< /O/NSO/NS 13 0 R/fence(true)/lspace(0)/maxsize(17.861pt)/minsize(17.861pt)/rspace(0)/symmetric(true) >> +<< /O/NSO/NS 12 0 R/lspace(0.278em)/rspace(0) >> endobj -196 0 obj -<< /O/NSO/NS 13 0 R/columnalign(right left right left)/columnspacing(0 .8em 0)/displaystyle(true) >> +178 0 obj +<< /O/NSO/NS 12 0 R/fence(true)/lspace(0)/maxsize(17.861pt)/minsize(17.861pt)/rspace(0)/symmetric(true) >> endobj -206 0 obj +201 0 obj +<< /O/NSO/NS 12 0 R/columnalign(right left right left)/columnspacing(0 .8em 0)/displaystyle(true) >> +endobj +211 0 obj <> stream (1)๐‘Ž๐‘๐‘=๐‘‘๐‘’๐‘“๐‘’i๐œ‹=โˆ’1(2)(1+2=3)(3)5 endstream endobj -147 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +152 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -215 0 obj -<< /O/NSO/NS 13 0 R/lspace(0)/rspace(0)/stretchy(false) >> +220 0 obj +<< /O/NSO/NS 12 0 R/lspace(0)/rspace(0)/stretchy(false) >> endobj -231 0 obj +236 0 obj <> stream sin(๐‘ฅ)โˆ’sin(๐‘ฅ+2๐œ‹)=0 endstream endobj -207 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +212 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> endobj -232 0 obj -<< /Type /Metadata /Subtype /XML /Length 10291 >> +237 0 obj +<< /Type /Metadata /Subtype /XML /Length 10342 >> stream @@ -282,17 +282,17 @@ stream 2.0 - Text + Text - en-US + en-US - 2001-01-01T20:59:59-00:00 + 2001-01-01T20:59:59-00:00 application/pdf @@ -311,7 +311,7 @@ stream endstream endobj -235 0 obj +240 0 obj << /Length 8175 >> stream /opacity1 gs @@ -904,615 +904,645 @@ EMC EMC endstream endobj -234 0 obj -<< /Type /Page /Contents 235 0 R /Resources 233 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 240 0 R >> +239 0 obj +<< /Type /Page /Contents 240 0 R /Resources 238 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 245 0 R >> endobj -233 0 obj -<< /ExtGState 1 0 R /Font << /F15 236 0 R /F20 237 0 R /F21 238 0 R /F32 239 0 R >> >> +238 0 obj +<< /ExtGState 1 0 R /Font << /F15 241 0 R /F20 242 0 R /F21 243 0 R /F32 244 0 R >> >> endobj 1 0 obj << /opacity1 <> >> endobj -241 0 obj +246 0 obj << /Marked true >> endobj 6 0 obj -<< /Nums [0 [ 19 0 R 79 0 R 23 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 90 0 R 91 0 R 93 0 R 41 0 R 50 0 R 52 0 R 53 0 R 54 0 R 69 0 R 71 0 R 104 0 R 105 0 R 108 0 R 110 0 R 111 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 123 0 R 124 0 R 125 0 R 132 0 R 134 0 R 136 0 R 140 0 R 139 0 R 143 0 R 144 0 R 150 0 R 151 0 R 152 0 R 155 0 R 156 0 R 157 0 R 158 0 R 161 0 R 163 0 R 164 0 R 167 0 R 169 0 R 170 0 R 172 0 R 174 0 R 175 0 R 176 0 R 179 0 R 180 0 R 181 0 R 187 0 R 211 0 R 212 0 R 213 0 R 214 0 R 216 0 R 217 0 R 218 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R] +<< /Nums [0 [ 24 0 R 84 0 R 28 0 R 30 0 R 32 0 R 34 0 R 36 0 R 38 0 R 40 0 R 42 0 R 44 0 R 95 0 R 96 0 R 98 0 R 46 0 R 55 0 R 57 0 R 58 0 R 59 0 R 74 0 R 76 0 R 109 0 R 110 0 R 113 0 R 115 0 R 116 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 128 0 R 129 0 R 130 0 R 137 0 R 139 0 R 141 0 R 145 0 R 144 0 R 148 0 R 149 0 R 155 0 R 156 0 R 157 0 R 160 0 R 161 0 R 162 0 R 163 0 R 166 0 R 168 0 R 169 0 R 172 0 R 174 0 R 175 0 R 177 0 R 179 0 R 180 0 R 181 0 R 184 0 R 185 0 R 186 0 R 192 0 R 216 0 R 217 0 R 218 0 R 219 0 R 221 0 R 222 0 R 223 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R] ] >> endobj -7 0 obj -<< >> +247 0 obj +<< /Limits [(ID.0001) (ID.0050)]/Names [(ID.0001) 22 0 R (ID.0002) 23 0 R (ID.0003) 24 0 R (ID.0004) 26 0 R (ID.0005) 27 0 R (ID.0006) 28 0 R (ID.0007) 29 0 R (ID.0008) 30 0 R (ID.0009) 31 0 R (ID.0010) 32 0 R (ID.0011) 33 0 R (ID.0012) 34 0 R (ID.0013) 35 0 R (ID.0014) 36 0 R (ID.0015) 37 0 R (ID.0016) 38 0 R (ID.0017) 39 0 R (ID.0018) 40 0 R (ID.0019) 41 0 R (ID.0020) 42 0 R (ID.0021) 43 0 R (ID.0022) 44 0 R (ID.0023) 45 0 R (ID.0024) 46 0 R (ID.0025) 47 0 R (ID.0026) 48 0 R (ID.0027) 49 0 R (ID.0028) 51 0 R (ID.0029) 52 0 R (ID.0030) 54 0 R (ID.0031) 55 0 R (ID.0032) 56 0 R (ID.0033) 57 0 R (ID.0034) 58 0 R (ID.0035) 59 0 R (ID.0036) 60 0 R (ID.0037) 61 0 R (ID.0038) 62 0 R (ID.0039) 63 0 R (ID.0040) 64 0 R (ID.0041) 65 0 R (ID.0042) 66 0 R (ID.0043) 67 0 R (ID.0044) 68 0 R (ID.0045) 69 0 R (ID.0046) 70 0 R (ID.0047) 71 0 R (ID.0048) 73 0 R (ID.0049) 74 0 R (ID.0050) 75 0 R ] >> endobj -9 0 obj +248 0 obj +<< /Limits [(ID.0051) (ID.0100)]/Names [(ID.0051) 76 0 R (ID.0052) 77 0 R (ID.0053) 78 0 R (ID.0054) 79 0 R (ID.0055) 80 0 R (ID.0056) 81 0 R (ID.0057) 83 0 R (ID.0058) 84 0 R (ID.0059) 86 0 R (ID.0060) 88 0 R (ID.0061) 90 0 R (ID.0062) 91 0 R (ID.0063) 92 0 R (ID.0064) 93 0 R (ID.0065) 94 0 R (ID.0066) 95 0 R (ID.0067) 96 0 R (ID.0068) 97 0 R (ID.0069) 98 0 R (ID.0070) 99 0 R (ID.0071) 100 0 R (ID.0072) 101 0 R (ID.0073) 102 0 R (ID.0074) 103 0 R (ID.0075) 107 0 R (ID.0076) 108 0 R (ID.0077) 109 0 R (ID.0078) 110 0 R (ID.0079) 111 0 R (ID.0080) 112 0 R (ID.0081) 113 0 R (ID.0082) 115 0 R (ID.0083) 116 0 R (ID.0084) 118 0 R (ID.0085) 119 0 R (ID.0086) 120 0 R (ID.0087) 121 0 R (ID.0088) 122 0 R (ID.0089) 123 0 R (ID.0090) 124 0 R (ID.0091) 125 0 R (ID.0092) 126 0 R (ID.0093) 127 0 R (ID.0094) 128 0 R (ID.0095) 129 0 R (ID.0096) 130 0 R (ID.0097) 134 0 R (ID.0098) 135 0 R (ID.0099) 136 0 R (ID.0100) 137 0 R ] >> +endobj +249 0 obj +<< /Limits [(ID.0101) (ID.0150)]/Names [(ID.0101) 139 0 R (ID.0102) 140 0 R (ID.0103) 141 0 R (ID.0104) 142 0 R (ID.0105) 143 0 R (ID.0106) 144 0 R (ID.0107) 145 0 R (ID.0108) 147 0 R (ID.0109) 148 0 R (ID.0110) 149 0 R (ID.0111) 153 0 R (ID.0112) 154 0 R (ID.0113) 155 0 R (ID.0114) 156 0 R (ID.0115) 157 0 R (ID.0116) 158 0 R (ID.0117) 159 0 R (ID.0118) 160 0 R (ID.0119) 161 0 R (ID.0120) 162 0 R (ID.0121) 163 0 R (ID.0122) 164 0 R (ID.0123) 165 0 R (ID.0124) 166 0 R (ID.0125) 167 0 R (ID.0126) 168 0 R (ID.0127) 169 0 R (ID.0128) 170 0 R (ID.0129) 171 0 R (ID.0130) 172 0 R (ID.0131) 174 0 R (ID.0132) 175 0 R (ID.0133) 176 0 R (ID.0134) 177 0 R (ID.0135) 179 0 R (ID.0136) 180 0 R (ID.0137) 181 0 R (ID.0138) 182 0 R (ID.0139) 183 0 R (ID.0140) 184 0 R (ID.0141) 185 0 R (ID.0142) 186 0 R (ID.0143) 187 0 R (ID.0144) 188 0 R (ID.0145) 189 0 R (ID.0146) 190 0 R (ID.0147) 191 0 R (ID.0148) 192 0 R (ID.0149) 193 0 R (ID.0150) 194 0 R ] >> +endobj +250 0 obj +<< /Limits [(ID.0151) (ID.0187)]/Names [(ID.0151) 195 0 R (ID.0152) 196 0 R (ID.0153) 197 0 R (ID.0154) 198 0 R (ID.0155) 199 0 R (ID.0156) 200 0 R (ID.0157) 202 0 R (ID.0158) 203 0 R (ID.0159) 204 0 R (ID.0160) 205 0 R (ID.0161) 206 0 R (ID.0162) 207 0 R (ID.0163) 208 0 R (ID.0164) 209 0 R (ID.0165) 210 0 R (ID.0166) 213 0 R (ID.0167) 214 0 R (ID.0168) 215 0 R (ID.0169) 216 0 R (ID.0170) 217 0 R (ID.0171) 218 0 R (ID.0172) 219 0 R (ID.0173) 221 0 R (ID.0174) 222 0 R (ID.0175) 223 0 R (ID.0176) 224 0 R (ID.0177) 225 0 R (ID.0178) 226 0 R (ID.0179) 227 0 R (ID.0180) 228 0 R (ID.0181) 229 0 R (ID.0182) 230 0 R (ID.0183) 231 0 R (ID.0184) 232 0 R (ID.0185) 233 0 R (ID.0186) 234 0 R (ID.0187) 235 0 R ] >> +endobj +251 0 obj +<< /Kids [247 0 R 248 0 R 249 0 R 250 0 R] >> +endobj +8 0 obj << /Type /Namespace /NS (http://iso.org/pdf/ssn) >> endobj -11 0 obj +10 0 obj << /Type /Namespace /NS (http://iso.org/pdf2/ssn) >> endobj -13 0 obj +12 0 obj << /Type /Namespace /NS (http://www.w3.org/1998/Math/MathML) >> endobj 15 0 obj -<< /Type /Namespace /NS (data:,A63761E-9D7-4FBB-9B27-C3BC8D9BFB06) >> +<< /title [/Title 10 0 R] /part [/Title 10 0 R] /section [/H1 10 0 R] /subsection [/H2 10 0 R] /subsubsection [/H3 10 0 R] /paragraph [/H4 10 0 R] /subparagraph [/H5 10 0 R] /itemize [/L 10 0 R] /enumerate [/L 10 0 R] /description [/L 10 0 R] /item [/LI 10 0 R] /itemlabel [/Lbl 10 0 R] /itembody [/LBody 10 0 R] /footnote [/FENote 10 0 R] /footnotemark [/Lbl 10 0 R] /footnotelabel [/Lbl 10 0 R] >> endobj -8 0 obj -[ 9 0 R 11 0 R 13 0 R 15 0 R ] +14 0 obj +<< /Type /Namespace /NS (https://www.latex-project.org/ns/dflt/2022) /RoleMapNS 15 0 R >> endobj 17 0 obj -<< /Type /StructElem /S /Document /P 5 0 R /K 18 0 R /NS 11 0 R >> +<< /chapter [/H1 10 0 R] /section [/H2 10 0 R] /subsection [/H3 10 0 R] /subsubsection [/H4 10 0 R] /paragraph [/H5 10 0 R] /subparagraph [/H6 10 0 R] >> endobj -18 0 obj -<< /Type /StructElem /S /Document /P 17 0 R /K [19 0 R 21 0 R 102 0 R 129 0 R 148 0 R 208 0 R] /NS 11 0 R >> +16 0 obj +<< /Type /Namespace /NS (https://www.latex-project.org/ns/book/2022) /RoleMapNS 17 0 R >> endobj 19 0 obj -<< /Type /StructElem /S /P /P 18 0 R /K <> /NS 11 0 R >> +<< /chapter [/Span 10 0 R] /section [/Span 10 0 R] /subsection [/Span 10 0 R] /subsubsection [/Span 10 0 R] /paragraph [/Span 10 0 R] /subparagraph [/Span 10 0 R] /P [/Span 10 0 R] >> endobj -21 0 obj -<< /Type /StructElem /S /Formula /P 18 0 R /K 76 0 R /AF [20 0 R] /NS 11 0 R >> +18 0 obj +<< /Type /Namespace /NS (https://www.latex-project.org/ns/inline/2022) /RoleMapNS 19 0 R >> +endobj +20 0 obj +<< /Type /Namespace /NS (data:,A63761E-9D7-4FBB-9B27-C3BC8D9BFB06) >> +endobj +7 0 obj +[ 8 0 R 10 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R ] endobj 22 0 obj -<< /Type /StructElem /S /mtd /P 86 0 R /K 23 0 R /NS 13 0 R >> +<< /Type /StructElem /S /Document /P 5 0 R /K 23 0 R /NS 10 0 R /ID (ID.0001) >> endobj 23 0 obj -<< /Type /StructElem /S /mn /P 22 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /Document /P 22 0 R /K [24 0 R 26 0 R 107 0 R 134 0 R 153 0 R 213 0 R] /NS 10 0 R /ID (ID.0002) >> endobj 24 0 obj -<< /Type /StructElem /S /mtd /P 86 0 R /K 25 0 R /NS 13 0 R >> -endobj -25 0 obj -<< /Type /StructElem /S /mn /P 24 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /P /P 23 0 R /K <> /NS 10 0 R /ID (ID.0003) >> endobj 26 0 obj -<< /Type /StructElem /S /mtd /P 86 0 R /K 27 0 R /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 23 0 R /K 81 0 R /AF [25 0 R] /NS 10 0 R /ID (ID.0004) >> endobj 27 0 obj -<< /Type /StructElem /S /mn /P 26 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 91 0 R /K 28 0 R /NS 12 0 R /ID (ID.0005) >> endobj 28 0 obj -<< /Type /StructElem /S /mtd /P 87 0 R /K 29 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 27 0 R /K <> /NS 12 0 R /ID (ID.0006) >> endobj 29 0 obj -<< /Type /StructElem /S /mn /P 28 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 91 0 R /K 30 0 R /NS 12 0 R /ID (ID.0007) >> endobj 30 0 obj -<< /Type /StructElem /S /mtd /P 87 0 R /K 31 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 29 0 R /K <> /NS 12 0 R /ID (ID.0008) >> endobj 31 0 obj -<< /Type /StructElem /S /mn /P 30 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 91 0 R /K 32 0 R /NS 12 0 R /ID (ID.0009) >> endobj 32 0 obj -<< /Type /StructElem /S /mtd /P 87 0 R /K 33 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 31 0 R /K <> /NS 12 0 R /ID (ID.0010) >> endobj 33 0 obj -<< /Type /StructElem /S /mn /P 32 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 92 0 R /K 34 0 R /NS 12 0 R /ID (ID.0011) >> endobj 34 0 obj -<< /Type /StructElem /S /mtd /P 88 0 R /K 35 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 33 0 R /K <> /NS 12 0 R /ID (ID.0012) >> endobj 35 0 obj -<< /Type /StructElem /S /mn /P 34 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 92 0 R /K 36 0 R /NS 12 0 R /ID (ID.0013) >> endobj 36 0 obj -<< /Type /StructElem /S /mtd /P 88 0 R /K 37 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 35 0 R /K <> /NS 12 0 R /ID (ID.0014) >> endobj 37 0 obj -<< /Type /StructElem /S /mn /P 36 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 92 0 R /K 38 0 R /NS 12 0 R /ID (ID.0015) >> endobj 38 0 obj -<< /Type /StructElem /S /mtd /P 88 0 R /K 39 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 37 0 R /K <> /NS 12 0 R /ID (ID.0016) >> endobj 39 0 obj -<< /Type /StructElem /S /mn /P 38 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 93 0 R /K 40 0 R /NS 12 0 R /ID (ID.0017) >> endobj 40 0 obj -<< /Type /StructElem /S /mtd /P 96 0 R /K 41 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 39 0 R /K <> /NS 12 0 R /ID (ID.0018) >> endobj 41 0 obj -<< /Type /StructElem /S /mn /P 40 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 93 0 R /K 42 0 R /NS 12 0 R /ID (ID.0019) >> endobj 42 0 obj -<< /Type /StructElem /S /mtext /K [ 43 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 41 0 R /K <> /NS 12 0 R /ID (ID.0020) >> endobj 43 0 obj -<< /Type /StructElem /S /math /P 42 0 R /K 44 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 93 0 R /K 44 0 R /NS 12 0 R /ID (ID.0021) >> endobj 44 0 obj -<< /Type /StructElem /S /mstyle /P 43 0 R /K [46 0 R 47 0 R 49 0 R] /A 45 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 43 0 R /K <> /NS 12 0 R /ID (ID.0022) >> +endobj +45 0 obj +<< /Type /StructElem /S /mtd /P 101 0 R /K 46 0 R /NS 12 0 R /ID (ID.0023) >> endobj 46 0 obj -<< /Type /StructElem /S /mi /P 44 0 R /K null /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 45 0 R /K <> /NS 12 0 R /ID (ID.0024) >> endobj 47 0 obj -<< /Type /StructElem /S /mo /P 44 0 R /K null /A 48 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K [ 48 0 R] /NS 12 0 R /ID (ID.0025) >> +endobj +48 0 obj +<< /Type /StructElem /S /math /P 47 0 R /K 49 0 R /NS 12 0 R /ID (ID.0026) >> endobj 49 0 obj -<< /Type /StructElem /S /mi /P 44 0 R /K null /NS 13 0 R >> -endobj -50 0 obj -<< /Type /StructElem /S /mtext /P 65 0 R /K [<> 51 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mstyle /P 48 0 R /K [51 0 R 52 0 R 54 0 R] /A 50 0 R /NS 12 0 R /ID (ID.0027) >> endobj 51 0 obj -<< /Type /StructElem /S /math /P 50 0 R /K [52 0 R 53 0 R 54 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 49 0 R /K null /NS 12 0 R /ID (ID.0028) >> endobj 52 0 obj -<< /Type /StructElem /S /mi /P 51 0 R /K <> /NS 13 0 R >> -endobj -53 0 obj -<< /Type /StructElem /S /mo /P 51 0 R /K <> /A 48 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 49 0 R /K null /A 53 0 R /NS 12 0 R /ID (ID.0029) >> endobj 54 0 obj -<< /Type /StructElem /S /mi /P 51 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 49 0 R /K null /NS 12 0 R /ID (ID.0030) >> endobj 55 0 obj -<< /Type /StructElem /S /mtext /K [ 56 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 70 0 R /K [<> 56 0 R] /NS 12 0 R /ID (ID.0031) >> endobj 56 0 obj -<< /Type /StructElem /S /math /P 55 0 R /K [57 0 R 58 0 R 59 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /math /P 55 0 R /K [57 0 R 58 0 R 59 0 R] /NS 12 0 R /ID (ID.0032) >> endobj 57 0 obj -<< /Type /StructElem /S /mi /P 56 0 R /K null /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 56 0 R /K <> /NS 12 0 R /ID (ID.0033) >> endobj 58 0 obj -<< /Type /StructElem /S /mo /P 56 0 R /K null /A 48 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 56 0 R /K <> /A 53 0 R /NS 12 0 R /ID (ID.0034) >> endobj 59 0 obj -<< /Type /StructElem /S /mi /P 56 0 R /K null /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 56 0 R /K <> /NS 12 0 R /ID (ID.0035) >> endobj 60 0 obj -<< /Type /StructElem /S /mtext /K [ 61 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K [ 61 0 R] /NS 12 0 R /ID (ID.0036) >> endobj 61 0 obj -<< /Type /StructElem /S /math /P 60 0 R /K [62 0 R 63 0 R 64 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /math /P 60 0 R /K [62 0 R 63 0 R 64 0 R] /NS 12 0 R /ID (ID.0037) >> endobj 62 0 obj -<< /Type /StructElem /S /mi /P 61 0 R /K null /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 61 0 R /K null /NS 12 0 R /ID (ID.0038) >> endobj 63 0 obj -<< /Type /StructElem /S /mo /P 61 0 R /K null /A 48 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 61 0 R /K null /A 53 0 R /NS 12 0 R /ID (ID.0039) >> endobj 64 0 obj -<< /Type /StructElem /S /mi /P 61 0 R /K null /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 61 0 R /K null /NS 12 0 R /ID (ID.0040) >> endobj 65 0 obj -<< /Type /StructElem /S /mtd /P 96 0 R /K [50 0 R 66 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K [ 66 0 R] /NS 12 0 R /ID (ID.0041) >> endobj 66 0 obj -<< /Type /StructElem /S /mi /P 65 0 R /A 67 0 R /NS 13 0 R >> +<< /Type /StructElem /S /math /P 65 0 R /K [67 0 R 68 0 R 69 0 R] /NS 12 0 R /ID (ID.0042) >> +endobj +67 0 obj +<< /Type /StructElem /S /mi /P 66 0 R /K null /NS 12 0 R /ID (ID.0043) >> endobj 68 0 obj -<< /Type /StructElem /S /mtd /P 97 0 R /K 69 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 66 0 R /K null /A 53 0 R /NS 12 0 R /ID (ID.0044) >> endobj 69 0 obj -<< /Type /StructElem /S /mn /P 68 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 66 0 R /K null /NS 12 0 R /ID (ID.0045) >> endobj 70 0 obj -<< /Type /StructElem /S /mtext /K null /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 101 0 R /K [55 0 R 71 0 R] /NS 12 0 R /ID (ID.0046) >> endobj 71 0 obj -<< /Type /StructElem /S /mtext /P 74 0 R /K <> /NS 13 0 R >> -endobj -72 0 obj -<< /Type /StructElem /S /mtext /K null /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 70 0 R /A 72 0 R /NS 12 0 R /ID (ID.0047) >> endobj 73 0 obj -<< /Type /StructElem /S /mtext /K null /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 102 0 R /K 74 0 R /NS 12 0 R /ID (ID.0048) >> endobj 74 0 obj -<< /Type /StructElem /S /mtd /P 97 0 R /K [71 0 R 75 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 73 0 R /K <> /NS 12 0 R /ID (ID.0049) >> endobj 75 0 obj -<< /Type /StructElem /S /mi /P 74 0 R /A 67 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K null /NS 12 0 R /ID (ID.0050) >> endobj 76 0 obj -<< /Type /StructElem /S /math /P 21 0 R /K [78 0 R 91 0 R 92 0 R] /A 77 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 79 0 R /K <> /NS 12 0 R /ID (ID.0051) >> +endobj +77 0 obj +<< /Type /StructElem /S /mtext /K null /NS 12 0 R /ID (ID.0052) >> endobj 78 0 obj -<< /Type /StructElem /S /mrow /P 76 0 R /K [79 0 R 81 0 R 83 0 R 89 0 R 90 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtext /K null /NS 12 0 R /ID (ID.0053) >> endobj 79 0 obj -<< /Type /StructElem /S /mo /P 78 0 R /K <> /A 80 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 102 0 R /K [76 0 R 80 0 R] /NS 12 0 R /ID (ID.0054) >> +endobj +80 0 obj +<< /Type /StructElem /S /mi /P 79 0 R /A 72 0 R /NS 12 0 R /ID (ID.0055) >> endobj 81 0 obj -<< /Type /StructElem /S /mspace /P 78 0 R /A 82 0 R /NS 13 0 R >> +<< /Type /StructElem /S /math /P 26 0 R /K [83 0 R 96 0 R 97 0 R] /A 82 0 R /NS 12 0 R /ID (ID.0056) >> endobj 83 0 obj -<< /Type /StructElem /S /mpadded /P 78 0 R /K 85 0 R /A 84 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 81 0 R /K [84 0 R 86 0 R 88 0 R 94 0 R 95 0 R] /NS 12 0 R /ID (ID.0057) >> endobj -85 0 obj -<< /Type /StructElem /S /mtable /P 83 0 R /K [86 0 R 87 0 R 88 0 R] /NS 13 0 R >> +84 0 obj +<< /Type /StructElem /S /mo /P 83 0 R /K <> /A 85 0 R /ActualText /NS 12 0 R /ID (ID.0058) >> endobj 86 0 obj -<< /Type /StructElem /S /mtr /P 85 0 R /K [22 0 R 24 0 R 26 0 R] /NS 13 0 R >> -endobj -87 0 obj -<< /Type /StructElem /S /mtr /P 85 0 R /K [28 0 R 30 0 R 32 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mspace /P 83 0 R /A 87 0 R /NS 12 0 R /ID (ID.0059) >> endobj 88 0 obj -<< /Type /StructElem /S /mtr /P 85 0 R /K [34 0 R 36 0 R 38 0 R] /NS 13 0 R >> -endobj -89 0 obj -<< /Type /StructElem /S /mspace /P 78 0 R /A 82 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mpadded /P 83 0 R /K 90 0 R /A 89 0 R /NS 12 0 R /ID (ID.0060) >> endobj 90 0 obj -<< /Type /StructElem /S /mo /P 78 0 R /K <> /A 80 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mtable /P 88 0 R /K [91 0 R 92 0 R 93 0 R] /NS 12 0 R /ID (ID.0061) >> endobj 91 0 obj -<< /Type /StructElem /S /mo /P 76 0 R /K <> /A 48 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtr /P 90 0 R /K [27 0 R 29 0 R 31 0 R] /NS 12 0 R /ID (ID.0062) >> endobj 92 0 obj -<< /Type /StructElem /S /mrow /P 76 0 R /K [93 0 R 94 0 R 98 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtr /P 90 0 R /K [33 0 R 35 0 R 37 0 R] /NS 12 0 R /ID (ID.0063) >> endobj 93 0 obj -<< /Type /StructElem /S /mo /P 92 0 R /K <> /A 80 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mtr /P 90 0 R /K [39 0 R 41 0 R 43 0 R] /NS 12 0 R /ID (ID.0064) >> endobj 94 0 obj -<< /Type /StructElem /S /mpadded /P 92 0 R /K 95 0 R /A 84 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mspace /P 83 0 R /A 87 0 R /NS 12 0 R /ID (ID.0065) >> endobj 95 0 obj -<< /Type /StructElem /S /mtable /P 94 0 R /K [96 0 R 97 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 83 0 R /K <> /A 85 0 R /ActualText /NS 12 0 R /ID (ID.0066) >> endobj 96 0 obj -<< /Type /StructElem /S /mtr /P 95 0 R /K [40 0 R 65 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 81 0 R /K <> /A 53 0 R /NS 12 0 R /ID (ID.0067) >> endobj 97 0 obj -<< /Type /StructElem /S /mtr /P 95 0 R /K [68 0 R 74 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 81 0 R /K [98 0 R 99 0 R 103 0 R] /NS 12 0 R /ID (ID.0068) >> endobj 98 0 obj -<< /Type /StructElem /S /mspace /P 92 0 R /A 99 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 97 0 R /K <> /A 85 0 R /ActualText /NS 12 0 R /ID (ID.0069) >> +endobj +99 0 obj +<< /Type /StructElem /S /mpadded /P 97 0 R /K 100 0 R /A 89 0 R /NS 12 0 R /ID (ID.0070) >> +endobj +100 0 obj +<< /Type /StructElem /S /mtable /P 99 0 R /K [101 0 R 102 0 R] /NS 12 0 R /ID (ID.0071) >> +endobj +101 0 obj +<< /Type /StructElem /S /mtr /P 100 0 R /K [45 0 R 70 0 R] /NS 12 0 R /ID (ID.0072) >> endobj 102 0 obj -<< /Type /StructElem /S /Formula /P 18 0 R /K 103 0 R /AF [101 0 R] /NS 11 0 R >> +<< /Type /StructElem /S /mtr /P 100 0 R /K [73 0 R 79 0 R] /NS 12 0 R /ID (ID.0073) >> endobj 103 0 obj -<< /Type /StructElem /S /math /P 102 0 R /K [104 0 R 105 0 R 106 0 R 125 0 R] /A 77 0 R /NS 13 0 R >> -endobj -104 0 obj -<< /Type /StructElem /S /mi /P 103 0 R /K <> /NS 13 0 R >> -endobj -105 0 obj -<< /Type /StructElem /S /mo /P 103 0 R /K <> /A 48 0 R /NS 13 0 R >> -endobj -106 0 obj -<< /Type /StructElem /S /mfrac /P 103 0 R /K [107 0 R 122 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mspace /P 97 0 R /A 104 0 R /NS 12 0 R /ID (ID.0074) >> endobj 107 0 obj -<< /Type /StructElem /S /mrow /P 106 0 R /K [108 0 R 110 0 R 111 0 R 113 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 23 0 R /K 108 0 R /AF [106 0 R] /NS 10 0 R /ID (ID.0075) >> endobj 108 0 obj -<< /Type /StructElem /S /mo /P 107 0 R /K <> /A 109 0 R /NS 13 0 R >> +<< /Type /StructElem /S /math /P 107 0 R /K [109 0 R 110 0 R 111 0 R 130 0 R] /A 82 0 R /NS 12 0 R /ID (ID.0076) >> +endobj +109 0 obj +<< /Type /StructElem /S /mi /P 108 0 R /K <> /NS 12 0 R /ID (ID.0077) >> endobj 110 0 obj -<< /Type /StructElem /S /mi /P 107 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 108 0 R /K <> /A 53 0 R /NS 12 0 R /ID (ID.0078) >> endobj 111 0 obj -<< /Type /StructElem /S /mo /P 107 0 R /K <> /A 112 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mfrac /P 108 0 R /K [112 0 R 127 0 R] /NS 12 0 R /ID (ID.0079) >> +endobj +112 0 obj +<< /Type /StructElem /S /mrow /P 111 0 R /K [113 0 R 115 0 R 116 0 R 118 0 R] /NS 12 0 R /ID (ID.0080) >> endobj 113 0 obj -<< /Type /StructElem /S /msqrt /P 107 0 R /K 114 0 R /NS 13 0 R >> -endobj -114 0 obj -<< /Type /StructElem /S /mrow /P 113 0 R /K [115 0 R 118 0 R 119 0 R 120 0 R 121 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 112 0 R /K <> /A 114 0 R /NS 12 0 R /ID (ID.0081) >> endobj 115 0 obj -<< /Type /StructElem /S /msup /P 114 0 R /K [116 0 R 117 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 112 0 R /K <> /NS 12 0 R /ID (ID.0082) >> endobj 116 0 obj -<< /Type /StructElem /S /mi /P 115 0 R /K <> /NS 13 0 R >> -endobj -117 0 obj -<< /Type /StructElem /S /mn /P 115 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 112 0 R /K <> /A 117 0 R /NS 12 0 R /ID (ID.0083) >> endobj 118 0 obj -<< /Type /StructElem /S /mo /P 114 0 R /K <> /A 112 0 R /NS 13 0 R >> +<< /Type /StructElem /S /msqrt /P 112 0 R /K 119 0 R /NS 12 0 R /ID (ID.0084) >> endobj 119 0 obj -<< /Type /StructElem /S /mn /P 114 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 118 0 R /K [120 0 R 123 0 R 124 0 R 125 0 R 126 0 R] /NS 12 0 R /ID (ID.0085) >> endobj 120 0 obj -<< /Type /StructElem /S /mi /P 114 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /msup /P 119 0 R /K [121 0 R 122 0 R] /NS 12 0 R /ID (ID.0086) >> endobj 121 0 obj -<< /Type /StructElem /S /mi /P 114 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 120 0 R /K <> /NS 12 0 R /ID (ID.0087) >> endobj 122 0 obj -<< /Type /StructElem /S /mrow /P 106 0 R /K [123 0 R 124 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 120 0 R /K <> /NS 12 0 R /ID (ID.0088) >> endobj 123 0 obj -<< /Type /StructElem /S /mn /P 122 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 119 0 R /K <> /A 117 0 R /NS 12 0 R /ID (ID.0089) >> endobj 124 0 obj -<< /Type /StructElem /S /mi /P 122 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 119 0 R /K <> /NS 12 0 R /ID (ID.0090) >> endobj 125 0 obj -<< /Type /StructElem /S /mo /P 103 0 R /K <> /A 126 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 119 0 R /K <> /NS 12 0 R /ID (ID.0091) >> +endobj +126 0 obj +<< /Type /StructElem /S /mi /P 119 0 R /K <> /NS 12 0 R /ID (ID.0092) >> +endobj +127 0 obj +<< /Type /StructElem /S /mrow /P 111 0 R /K [128 0 R 129 0 R] /NS 12 0 R /ID (ID.0093) >> +endobj +128 0 obj +<< /Type /StructElem /S /mn /P 127 0 R /K <> /NS 12 0 R /ID (ID.0094) >> endobj 129 0 obj -<< /Type /StructElem /S /Formula /P 18 0 R /K 130 0 R /AF [128 0 R] /NS 11 0 R >> +<< /Type /StructElem /S /mi /P 127 0 R /K <> /NS 12 0 R /ID (ID.0095) >> endobj 130 0 obj -<< /Type /StructElem /S /math /P 129 0 R /K [131 0 R 135 0 R 138 0 R 142 0 R] /A 77 0 R /NS 13 0 R >> -endobj -131 0 obj -<< /Type /StructElem /S /munder /P 130 0 R /K [132 0 R 134 0 R] /NS 13 0 R >> -endobj -132 0 obj -<< /Type /StructElem /S /mo /P 131 0 R /K <> /A 133 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 108 0 R /K <> /A 131 0 R /NS 12 0 R /ID (ID.0096) >> endobj 134 0 obj -<< /Type /StructElem /S /mi /P 131 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 23 0 R /K 135 0 R /AF [133 0 R] /NS 10 0 R /ID (ID.0097) >> endobj 135 0 obj -<< /Type /StructElem /S /munder /P 130 0 R /K [136 0 R 137 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /math /P 134 0 R /K [136 0 R 140 0 R 143 0 R 147 0 R] /A 82 0 R /NS 12 0 R /ID (ID.0098) >> endobj 136 0 obj -<< /Type /StructElem /S /mi /P 135 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /munder /P 135 0 R /K [137 0 R 139 0 R] /NS 12 0 R /ID (ID.0099) >> endobj 137 0 obj -<< /Type /StructElem /S /mo /P 135 0 R /NS 13 0 R >> -endobj -138 0 obj -<< /Type /StructElem /S /mover /P 130 0 R /K [139 0 R 140 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 136 0 R /K <> /A 138 0 R /NS 12 0 R /ID (ID.0100) >> endobj 139 0 obj -<< /Type /StructElem /S /mi /P 138 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 136 0 R /K <> /NS 12 0 R /ID (ID.0101) >> endobj 140 0 obj -<< /Type /StructElem /S /mo /P 138 0 R /K <> /A 141 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /munder /P 135 0 R /K [141 0 R 142 0 R] /NS 12 0 R /ID (ID.0102) >> +endobj +141 0 obj +<< /Type /StructElem /S /mi /P 140 0 R /K <> /NS 12 0 R /ID (ID.0103) >> endobj 142 0 obj -<< /Type /StructElem /S /msup /P 130 0 R /K [143 0 R 144 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 140 0 R /NS 12 0 R /ID (ID.0104) >> endobj 143 0 obj -<< /Type /StructElem /S /mi /P 142 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mover /P 135 0 R /K [144 0 R 145 0 R] /NS 12 0 R /ID (ID.0105) >> endobj 144 0 obj -<< /Type /StructElem /S /mi /P 142 0 R /K <> /A 145 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 143 0 R /K <> /NS 12 0 R /ID (ID.0106) >> +endobj +145 0 obj +<< /Type /StructElem /S /mo /P 143 0 R /K <> /A 146 0 R /ActualText /NS 12 0 R /ID (ID.0107) >> +endobj +147 0 obj +<< /Type /StructElem /S /msup /P 135 0 R /K [148 0 R 149 0 R] /NS 12 0 R /ID (ID.0108) >> endobj 148 0 obj -<< /Type /StructElem /S /Formula /P 18 0 R /K 194 0 R /AF [147 0 R] /NS 11 0 R >> +<< /Type /StructElem /S /mi /P 147 0 R /K <> /NS 12 0 R /ID (ID.0109) >> endobj 149 0 obj -<< /Type /StructElem /S /mtd /P 197 0 R /K [150 0 R 151 0 R 152 0 R] /NS 13 0 R >> -endobj -150 0 obj -<< /Type /StructElem /S /mi /P 149 0 R /K <> /NS 13 0 R >> -endobj -151 0 obj -<< /Type /StructElem /S /mi /P 149 0 R /K <> /NS 13 0 R >> -endobj -152 0 obj -<< /Type /StructElem /S /mi /P 149 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 147 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0110) >> endobj 153 0 obj -<< /Type /StructElem /S /mtd /P 197 0 R /K [154 0 R 155 0 R 156 0 R 157 0 R 158 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 23 0 R /K 199 0 R /AF [152 0 R] /NS 10 0 R /ID (ID.0111) >> endobj 154 0 obj -<< /Type /StructElem /S /mi /P 153 0 R /A 67 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 202 0 R /K [155 0 R 156 0 R 157 0 R] /NS 12 0 R /ID (ID.0112) >> endobj 155 0 obj -<< /Type /StructElem /S /mo /P 153 0 R /K <> /A 48 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 154 0 R /K <> /NS 12 0 R /ID (ID.0113) >> endobj 156 0 obj -<< /Type /StructElem /S /mi /P 153 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 154 0 R /K <> /NS 12 0 R /ID (ID.0114) >> endobj 157 0 obj -<< /Type /StructElem /S /mi /P 153 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 154 0 R /K <> /NS 12 0 R /ID (ID.0115) >> endobj 158 0 obj -<< /Type /StructElem /S /mi /P 153 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 202 0 R /K [159 0 R 160 0 R 161 0 R 162 0 R 163 0 R] /NS 12 0 R /ID (ID.0116) >> endobj 159 0 obj -<< /Type /StructElem /S /mtd /P 197 0 R /K 160 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 158 0 R /A 72 0 R /NS 12 0 R /ID (ID.0117) >> endobj 160 0 obj -<< /Type /StructElem /S /msup /P 159 0 R /K [161 0 R 162 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 158 0 R /K <> /A 53 0 R /NS 12 0 R /ID (ID.0118) >> endobj 161 0 obj -<< /Type /StructElem /S /mi /P 160 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 158 0 R /K <> /NS 12 0 R /ID (ID.0119) >> endobj 162 0 obj -<< /Type /StructElem /S /mrow /P 160 0 R /K [163 0 R 164 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 158 0 R /K <> /NS 12 0 R /ID (ID.0120) >> endobj 163 0 obj -<< /Type /StructElem /S /mi /P 162 0 R /K <> /A 145 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 158 0 R /K <> /NS 12 0 R /ID (ID.0121) >> endobj 164 0 obj -<< /Type /StructElem /S /mi /P 162 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 202 0 R /K 165 0 R /NS 12 0 R /ID (ID.0122) >> endobj 165 0 obj -<< /Type /StructElem /S /mtd /P 197 0 R /K [166 0 R 167 0 R 169 0 R 170 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /msup /P 164 0 R /K [166 0 R 167 0 R] /NS 12 0 R /ID (ID.0123) >> endobj 166 0 obj -<< /Type /StructElem /S /mi /P 165 0 R /A 67 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 165 0 R /K <> /NS 12 0 R /ID (ID.0124) >> endobj 167 0 obj -<< /Type /StructElem /S /mo /P 165 0 R /K <> /A 168 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 165 0 R /K [168 0 R 169 0 R] /NS 12 0 R /ID (ID.0125) >> +endobj +168 0 obj +<< /Type /StructElem /S /mi /P 167 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0126) >> endobj 169 0 obj -<< /Type /StructElem /S /mo /P 165 0 R /K <> /A 168 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 167 0 R /K <> /NS 12 0 R /ID (ID.0127) >> endobj 170 0 obj -<< /Type /StructElem /S /mn /P 165 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 202 0 R /K [171 0 R 172 0 R 174 0 R 175 0 R] /NS 12 0 R /ID (ID.0128) >> endobj 171 0 obj -<< /Type /StructElem /S /mtd /P 200 0 R /K [172 0 R 174 0 R 175 0 R 176 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 170 0 R /A 72 0 R /NS 12 0 R /ID (ID.0129) >> endobj 172 0 obj -<< /Type /StructElem /S /mo /P 171 0 R /K <> /A 173 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 170 0 R /K <> /A 173 0 R /NS 12 0 R /ID (ID.0130) >> endobj 174 0 obj -<< /Type /StructElem /S /mn /P 171 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 170 0 R /K <> /A 173 0 R /NS 12 0 R /ID (ID.0131) >> endobj 175 0 obj -<< /Type /StructElem /S /mo /P 171 0 R /K <> /A 112 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 170 0 R /K <> /NS 12 0 R /ID (ID.0132) >> endobj 176 0 obj -<< /Type /StructElem /S /mn /P 171 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 205 0 R /K [177 0 R 179 0 R 180 0 R 181 0 R] /NS 12 0 R /ID (ID.0133) >> endobj 177 0 obj -<< /Type /StructElem /S /mtd /P 200 0 R /K [178 0 R 179 0 R 180 0 R 181 0 R] /NS 13 0 R >> -endobj -178 0 obj -<< /Type /StructElem /S /mi /P 177 0 R /A 67 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 176 0 R /K <> /A 178 0 R /ActualText /NS 12 0 R /ID (ID.0134) >> endobj 179 0 obj -<< /Type /StructElem /S /mo /P 177 0 R /K <> /A 48 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 176 0 R /K <> /NS 12 0 R /ID (ID.0135) >> endobj 180 0 obj -<< /Type /StructElem /S /mn /P 177 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 176 0 R /K <> /A 117 0 R /NS 12 0 R /ID (ID.0136) >> endobj 181 0 obj -<< /Type /StructElem /S /mo /P 177 0 R /K <> /A 173 0 R /ActualText /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 176 0 R /K <> /NS 12 0 R /ID (ID.0137) >> endobj 182 0 obj -<< /Type /StructElem /S /mtd /P 200 0 R /K 183 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 205 0 R /K [183 0 R 184 0 R 185 0 R 186 0 R] /NS 12 0 R /ID (ID.0138) >> endobj 183 0 obj -<< /Type /StructElem /S /mi /P 182 0 R /A 67 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 182 0 R /A 72 0 R /NS 12 0 R /ID (ID.0139) >> endobj 184 0 obj -<< /Type /StructElem /S /mtd /P 200 0 R /K 185 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 182 0 R /K <> /A 53 0 R /NS 12 0 R /ID (ID.0140) >> endobj 185 0 obj -<< /Type /StructElem /S /mi /P 184 0 R /A 67 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 182 0 R /K <> /NS 12 0 R /ID (ID.0141) >> endobj 186 0 obj -<< /Type /StructElem /S /mtd /P 203 0 R /K 187 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 182 0 R /K <> /A 178 0 R /ActualText /NS 12 0 R /ID (ID.0142) >> endobj 187 0 obj -<< /Type /StructElem /S /mn /P 186 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 205 0 R /K 188 0 R /NS 12 0 R /ID (ID.0143) >> endobj 188 0 obj -<< /Type /StructElem /S /mtd /P 203 0 R /K 189 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 187 0 R /A 72 0 R /NS 12 0 R /ID (ID.0144) >> endobj 189 0 obj -<< /Type /StructElem /S /mi /P 188 0 R /A 67 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 205 0 R /K 190 0 R /NS 12 0 R /ID (ID.0145) >> endobj 190 0 obj -<< /Type /StructElem /S /mtd /P 203 0 R /K 191 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 189 0 R /A 72 0 R /NS 12 0 R /ID (ID.0146) >> endobj 191 0 obj -<< /Type /StructElem /S /mi /P 190 0 R /A 67 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 208 0 R /K 192 0 R /NS 12 0 R /ID (ID.0147) >> endobj 192 0 obj -<< /Type /StructElem /S /mtd /P 203 0 R /K 193 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mn /P 191 0 R /K <> /NS 12 0 R /ID (ID.0148) >> endobj 193 0 obj -<< /Type /StructElem /S /mi /P 192 0 R /A 67 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 208 0 R /K 194 0 R /NS 12 0 R /ID (ID.0149) >> endobj 194 0 obj -<< /Type /StructElem /S /math /P 148 0 R /K 195 0 R /A 77 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 193 0 R /A 72 0 R /NS 12 0 R /ID (ID.0150) >> endobj 195 0 obj -<< /Type /StructElem /S /mtable /P 194 0 R /K [197 0 R 200 0 R 203 0 R] /A 196 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 208 0 R /K 196 0 R /NS 12 0 R /ID (ID.0151) >> +endobj +196 0 obj +<< /Type /StructElem /S /mi /P 195 0 R /A 72 0 R /NS 12 0 R /ID (ID.0152) >> endobj 197 0 obj -<< /Type /StructElem /S /mlabeledtr /P 195 0 R /K [198 0 R 149 0 R 153 0 R 159 0 R 165 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 208 0 R /K 198 0 R /NS 12 0 R /ID (ID.0153) >> endobj 198 0 obj -<< /Type /StructElem /S /mtd /P 197 0 R /K 199 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 197 0 R /A 72 0 R /NS 12 0 R /ID (ID.0154) >> endobj 199 0 obj -<< /Type /StructElem /S /mtext /P 198 0 R /NS 13 0 R >> +<< /Type /StructElem /S /math /P 153 0 R /K 200 0 R /A 82 0 R /NS 12 0 R /ID (ID.0155) >> endobj 200 0 obj -<< /Type /StructElem /S /mlabeledtr /P 195 0 R /K [201 0 R 171 0 R 177 0 R 182 0 R 184 0 R] /NS 13 0 R >> -endobj -201 0 obj -<< /Type /StructElem /S /mtd /P 200 0 R /K 202 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtable /P 199 0 R /K [202 0 R 205 0 R 208 0 R] /A 201 0 R /NS 12 0 R /ID (ID.0156) >> endobj 202 0 obj -<< /Type /StructElem /S /mtext /P 201 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mlabeledtr /P 200 0 R /K [203 0 R 154 0 R 158 0 R 164 0 R 170 0 R] /NS 12 0 R /ID (ID.0157) >> endobj 203 0 obj -<< /Type /StructElem /S /mlabeledtr /P 195 0 R /K [204 0 R 186 0 R 188 0 R 190 0 R 192 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 202 0 R /K 204 0 R /NS 12 0 R /ID (ID.0158) >> endobj 204 0 obj -<< /Type /StructElem /S /mtd /P 203 0 R /K 205 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 203 0 R /NS 12 0 R /ID (ID.0159) >> endobj 205 0 obj -<< /Type /StructElem /S /mtext /P 204 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mlabeledtr /P 200 0 R /K [206 0 R 176 0 R 182 0 R 187 0 R 189 0 R] /NS 12 0 R /ID (ID.0160) >> +endobj +206 0 obj +<< /Type /StructElem /S /mtd /P 205 0 R /K 207 0 R /NS 12 0 R /ID (ID.0161) >> +endobj +207 0 obj +<< /Type /StructElem /S /mtext /P 206 0 R /NS 12 0 R /ID (ID.0162) >> endobj 208 0 obj -<< /Type /StructElem /S /Formula /P 18 0 R /K 209 0 R /AF [207 0 R] /NS 11 0 R >> +<< /Type /StructElem /S /mlabeledtr /P 200 0 R /K [209 0 R 191 0 R 193 0 R 195 0 R 197 0 R] /NS 12 0 R /ID (ID.0163) >> endobj 209 0 obj -<< /Type /StructElem /S /math /P 208 0 R /K [210 0 R 214 0 R 216 0 R 217 0 R 218 0 R 219 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R] /NS 13 0 R >> +<< /Type /StructElem /S /mtd /P 208 0 R /K 210 0 R /NS 12 0 R /ID (ID.0164) >> endobj 210 0 obj -<< /Type /StructElem /S /mrow /P 209 0 R /K [211 0 R 212 0 R 213 0 R] /NS 13 0 R >> -endobj -211 0 obj -<< /Type /StructElem /S /mi /P 210 0 R /K <> /A 145 0 R /NS 13 0 R >> -endobj -212 0 obj -<< /Type /StructElem /S /mi /P 210 0 R /K <> /A 145 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mtext /P 209 0 R /NS 12 0 R /ID (ID.0165) >> endobj 213 0 obj -<< /Type /StructElem /S /mi /P 210 0 R /K <> /A 145 0 R /NS 13 0 R >> +<< /Type /StructElem /S /Formula /P 23 0 R /K 214 0 R /AF [212 0 R] /NS 10 0 R /ID (ID.0166) >> endobj 214 0 obj -<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 215 0 R /NS 13 0 R >> +<< /Type /StructElem /S /math /P 213 0 R /K [215 0 R 219 0 R 221 0 R 222 0 R 223 0 R 224 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R] /NS 12 0 R /ID (ID.0167) >> +endobj +215 0 obj +<< /Type /StructElem /S /mrow /P 214 0 R /K [216 0 R 217 0 R 218 0 R] /NS 12 0 R /ID (ID.0168) >> endobj 216 0 obj -<< /Type /StructElem /S /mi /P 209 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 215 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0169) >> endobj 217 0 obj -<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 215 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 215 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0170) >> endobj 218 0 obj -<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 112 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 215 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0171) >> endobj 219 0 obj -<< /Type /StructElem /S /mrow /P 209 0 R /K [220 0 R 221 0 R 222 0 R] /NS 13 0 R >> -endobj -220 0 obj -<< /Type /StructElem /S /mi /P 219 0 R /K <> /A 145 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 220 0 R /NS 12 0 R /ID (ID.0172) >> endobj 221 0 obj -<< /Type /StructElem /S /mi /P 219 0 R /K <> /A 145 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 214 0 R /K <> /NS 12 0 R /ID (ID.0173) >> endobj 222 0 obj -<< /Type /StructElem /S /mi /P 219 0 R /K <> /A 145 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 220 0 R /NS 12 0 R /ID (ID.0174) >> endobj 223 0 obj -<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 215 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 117 0 R /NS 12 0 R /ID (ID.0175) >> endobj 224 0 obj -<< /Type /StructElem /S /mi /P 209 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mrow /P 214 0 R /K [225 0 R 226 0 R 227 0 R] /NS 12 0 R /ID (ID.0176) >> endobj 225 0 obj -<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 112 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 224 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0177) >> endobj 226 0 obj -<< /Type /StructElem /S /mn /P 209 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 224 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0178) >> endobj 227 0 obj -<< /Type /StructElem /S /mi /P 209 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 224 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0179) >> endobj 228 0 obj -<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 215 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 220 0 R /NS 12 0 R /ID (ID.0180) >> endobj 229 0 obj -<< /Type /StructElem /S /mo /P 209 0 R /K <> /A 48 0 R /NS 13 0 R >> +<< /Type /StructElem /S /mi /P 214 0 R /K <> /NS 12 0 R /ID (ID.0181) >> endobj 230 0 obj -<< /Type /StructElem /S /mn /P 209 0 R /K <> /NS 13 0 R >> +<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 117 0 R /NS 12 0 R /ID (ID.0182) >> +endobj +231 0 obj +<< /Type /StructElem /S /mn /P 214 0 R /K <> /NS 12 0 R /ID (ID.0183) >> +endobj +232 0 obj +<< /Type /StructElem /S /mi /P 214 0 R /K <> /NS 12 0 R /ID (ID.0184) >> +endobj +233 0 obj +<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 220 0 R /NS 12 0 R /ID (ID.0185) >> +endobj +234 0 obj +<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 53 0 R /NS 12 0 R /ID (ID.0186) >> +endobj +235 0 obj +<< /Type /StructElem /S /mn /P 214 0 R /K <> /NS 12 0 R /ID (ID.0187) >> endobj 5 0 obj -<< /Type /StructTreeRoot /K 17 0 R /ParentTree 6 0 R /RoleMap 7 0 R /Namespaces 8 0 R >> +<< /Type /StructTreeRoot /K 22 0 R /IDTree 251 0 R /ParentTree 6 0 R /Namespaces 7 0 R >> endobj -242 0 obj +252 0 obj [ 66 [ 323 ] ] endobj -244 0 obj +254 0 obj << /Subtype /CIDFontType0C /Length 592 >> [BINARY STREAM] endobj -243 0 obj -<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 244 0 R >> +253 0 obj +<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 254 0 R >> endobj -245 0 obj +255 0 obj << /Length 687 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1548,23 +1578,23 @@ end %%EOF endstream endobj -239 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 246 0 R ] /ToUnicode 245 0 R >> +244 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 256 0 R ] /ToUnicode 255 0 R >> endobj -246 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 243 0 R /W 242 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +256 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 253 0 R /W 252 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -247 0 obj +257 0 obj [ 1013 [ 569 ] 1404 [ 620 ] 2981 [ 407 ] 4558 [ 668 ] ] endobj -249 0 obj +259 0 obj << /Subtype /CIDFontType0C /Length 1102 >> [BINARY STREAM] endobj -248 0 obj -<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 249 0 R >> +258 0 obj +<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 259 0 R >> endobj -250 0 obj +260 0 obj << /Length 772 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1603,23 +1633,23 @@ end %%EOF endstream endobj -238 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 251 0 R ] /ToUnicode 250 0 R >> +243 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 261 0 R ] /ToUnicode 260 0 R >> endobj -251 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 248 0 R /W 247 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +261 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 258 0 R /W 257 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -252 0 obj +262 0 obj [ 9 [ 389 389 ] 12 [ 778 ] 15 [ 278 ] 17 [ 500 500 500 500 500 500 ] 30 [ 778 ] 1296 [ 529 429 433 520 466 490 ] 1319 [ 572 ] 1790 [ 0 ] 2455 [ 663 663 ] 2503 [ 875 875 875 875 875 875 ] 2515 [ 902 ] 2615 [ 778 ] 2619 [ 778 ] 3074 [ 1444 ] 3077 [ 833 ] 4474 [ 570 ] ] endobj -254 0 obj +264 0 obj << /Subtype /CIDFontType0C /Length 4088 >> [BINARY STREAM] endobj -253 0 obj -<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 254 0 R >> +263 0 obj +<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 264 0 R >> endobj -255 0 obj +265 0 obj << /Length 1203 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1687,23 +1717,23 @@ end %%EOF endstream endobj -237 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 256 0 R ] /ToUnicode 255 0 R >> +242 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 266 0 R ] /ToUnicode 265 0 R >> endobj -256 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 253 0 R /W 252 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +266 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 263 0 R /W 262 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -257 0 obj +267 0 obj [ 49 [ 681 444 ] 55 [ 306 ] 59 [ 500 ] 63 [ 556 ] 66 [ 278 ] 72 [ 278 ] 77 [ 556 ] 81 [ 500 500 ] 85 [ 389 389 ] 88 [ 278 ] 98 [ 394 ] 103 [ 333 ] 105 [ 389 500 500 ] ] endobj -259 0 obj +269 0 obj << /Subtype /CIDFontType0C /Length 2411 >> [BINARY STREAM] endobj -258 0 obj -<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 259 0 R >> +268 0 obj +<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 269 0 R >> endobj -260 0 obj +270 0 obj << /Length 931 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1756,289 +1786,299 @@ end %%EOF endstream endobj -236 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 261 0 R ] /ToUnicode 260 0 R >> +241 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 271 0 R ] /ToUnicode 270 0 R >> endobj -261 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 258 0 R /W 257 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +271 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 268 0 R /W 267 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -240 0 obj -<< /Type /Pages /Count 1 /Kids [ 234 0 R ] >> +245 0 obj +<< /Type /Pages /Count 1 /Kids [ 239 0 R ] >> endobj -262 0 obj -<< /Type /Catalog /Pages 240 0 R /MarkInfo 241 0 R/Lang (en-US)/Metadata 232 0 R/StructTreeRoot 5 0 R >> +272 0 obj +<< /Type /Catalog /Pages 245 0 R /MarkInfo 246 0 R/Lang (en-US)/Metadata 237 0 R/StructTreeRoot 5 0 R >> endobj -263 0 obj +273 0 obj << /Producer (LuaTeX)/Creator (TeX)/CreationDate (D:20010101205959-00'00')/ModDate (D:20010101205959-00'00') /Trapped /False >> endobj xref -0 264 +0 274 0000000002 65535 f -0000026225 00000 n +0000026277 00000 n 0000000003 00000 f 0000000004 00000 f -0000000010 00000 f -0000046715 00000 n -0000026309 00000 n -0000026972 00000 n -0000027300 00000 n -0000026994 00000 n -0000000012 00000 f -0000027062 00000 n -0000000014 00000 f -0000027132 00000 n -0000000016 00000 f -0000027213 00000 n +0000000009 00000 f +0000054118 00000 n +0000026361 00000 n +0000032049 00000 n +0000030631 00000 n +0000000011 00000 f +0000030699 00000 n +0000000013 00000 f +0000030769 00000 n +0000000021 00000 f +0000031267 00000 n +0000030850 00000 n +0000031545 00000 n +0000031374 00000 n +0000031853 00000 n +0000031652 00000 n +0000031962 00000 n 0000000000 00000 f -0000027347 00000 n -0000027432 00000 n -0000027559 00000 n -0000001941 00000 n -0000027667 00000 n -0000027765 00000 n -0000027846 00000 n -0000027955 00000 n -0000028036 00000 n -0000028145 00000 n -0000028226 00000 n -0000028335 00000 n -0000028416 00000 n -0000028525 00000 n -0000028606 00000 n -0000028715 00000 n -0000028796 00000 n -0000028905 00000 n -0000028986 00000 n -0000029095 00000 n -0000029176 00000 n -0000029285 00000 n -0000029366 00000 n -0000029476 00000 n -0000029557 00000 n -0000029667 00000 n -0000029743 00000 n -0000029825 00000 n +0000032117 00000 n +0000032216 00000 n +0000032357 00000 n +0000001942 00000 n +0000032479 00000 n +0000032591 00000 n +0000032686 00000 n +0000032809 00000 n +0000032904 00000 n +0000033027 00000 n +0000033122 00000 n +0000033245 00000 n +0000033340 00000 n +0000033463 00000 n +0000033558 00000 n +0000033681 00000 n +0000033776 00000 n +0000033899 00000 n +0000033994 00000 n +0000034117 00000 n +0000034212 00000 n +0000034335 00000 n +0000034430 00000 n +0000034554 00000 n +0000034650 00000 n +0000034774 00000 n +0000034864 00000 n +0000034960 00000 n 0000000020 00000 n -0000029936 00000 n -0000030014 00000 n +0000035085 00000 n +0000035177 00000 n 0000000093 00000 n -0000030103 00000 n -0000030181 00000 n -0000030303 00000 n -0000030401 00000 n -0000030511 00000 n -0000030632 00000 n -0000030742 00000 n -0000030818 00000 n -0000030916 00000 n -0000030994 00000 n -0000031083 00000 n -0000031161 00000 n -0000031237 00000 n -0000031335 00000 n -0000031413 00000 n -0000031502 00000 n -0000031580 00000 n -0000031670 00000 n +0000035280 00000 n +0000035372 00000 n +0000035508 00000 n +0000035620 00000 n +0000035744 00000 n +0000035879 00000 n +0000036003 00000 n +0000036093 00000 n +0000036205 00000 n +0000036297 00000 n +0000036400 00000 n +0000036492 00000 n +0000036582 00000 n +0000036694 00000 n +0000036786 00000 n +0000036889 00000 n +0000036981 00000 n +0000037086 00000 n 0000000164 00000 n -0000031751 00000 n -0000031832 00000 n -0000031942 00000 n -0000032013 00000 n -0000032126 00000 n -0000032197 00000 n -0000032268 00000 n -0000032358 00000 n -0000032439 00000 n +0000037181 00000 n +0000037277 00000 n +0000037401 00000 n +0000037486 00000 n +0000037613 00000 n +0000037698 00000 n +0000037783 00000 n +0000037888 00000 n +0000037983 00000 n 0000000219 00000 n -0000032548 00000 n -0000032660 00000 n +0000038106 00000 n +0000038232 00000 n 0000000273 00000 n -0000032803 00000 n +0000038389 00000 n 0000000360 00000 n -0000032888 00000 n +0000038488 00000 n 0000000415 00000 n -0000032984 00000 n -0000033084 00000 n -0000033181 00000 n -0000033278 00000 n -0000033375 00000 n -0000033460 00000 n -0000033604 00000 n -0000033725 00000 n -0000033823 00000 n -0000033967 00000 n -0000034063 00000 n -0000034156 00000 n -0000034246 00000 n -0000034336 00000 n -0000000487 00000 n -0000000541 00000 n -0000003012 00000 n -0000034421 00000 n -0000034522 00000 n -0000034644 00000 n -0000034756 00000 n -0000034879 00000 n -0000034975 00000 n -0000035086 00000 n -0000002121 00000 n -0000035210 00000 n -0000035322 00000 n -0000002187 00000 n -0000035446 00000 n -0000035532 00000 n -0000035651 00000 n -0000035746 00000 n -0000035858 00000 n -0000035970 00000 n -0000036094 00000 n -0000036206 00000 n -0000036318 00000 n -0000036430 00000 n -0000036525 00000 n -0000036637 00000 n -0000036749 00000 n -0000002259 00000 n -0000002319 00000 n -0000003882 00000 n -0000036873 00000 n -0000036974 00000 n -0000037096 00000 n -0000037193 00000 n -0000003193 00000 n -0000037317 00000 n -0000037429 00000 n -0000037526 00000 n -0000037638 00000 n -0000037710 00000 n -0000037806 00000 n -0000037918 00000 n -0000003279 00000 n -0000038065 00000 n -0000038160 00000 n -0000038272 00000 n -0000003334 00000 n -0000003394 00000 n -0000005871 00000 n -0000038396 00000 n -0000038497 00000 n -0000038599 00000 n -0000038711 00000 n +0000038598 00000 n +0000038712 00000 n 0000038823 00000 n -0000038935 00000 n -0000039053 00000 n -0000039136 00000 n -0000039259 00000 n -0000039371 00000 n -0000039483 00000 n -0000039595 00000 n -0000039679 00000 n -0000039774 00000 n -0000039886 00000 n -0000039981 00000 n -0000040105 00000 n -0000040217 00000 n -0000040327 00000 n -0000040410 00000 n -0000004063 00000 n -0000040534 00000 n -0000040658 00000 n -0000040770 00000 n -0000040880 00000 n -0000004129 00000 n -0000041027 00000 n -0000041139 00000 n -0000041263 00000 n -0000041375 00000 n -0000041485 00000 n -0000041568 00000 n -0000041691 00000 n -0000041803 00000 n -0000041950 00000 n -0000042034 00000 n -0000042117 00000 n -0000042201 00000 n -0000042284 00000 n -0000042368 00000 n -0000042480 00000 n -0000042564 00000 n -0000042647 00000 n -0000042731 00000 n -0000042814 00000 n -0000042898 00000 n -0000042981 00000 n -0000043077 00000 n -0000004253 00000 n -0000043194 00000 n -0000043319 00000 n -0000043403 00000 n -0000043478 00000 n -0000043603 00000 n -0000043687 00000 n -0000043762 00000 n -0000043887 00000 n -0000043971 00000 n -0000004371 00000 n -0000007183 00000 n -0000044046 00000 n -0000044147 00000 n -0000044338 00000 n -0000044441 00000 n -0000044565 00000 n -0000044689 00000 n -0000044813 00000 n -0000006052 00000 n -0000044937 00000 n -0000045049 00000 n -0000045173 00000 n -0000045297 00000 n -0000045400 00000 n -0000045524 00000 n -0000045648 00000 n -0000045772 00000 n -0000045896 00000 n -0000046008 00000 n -0000046132 00000 n -0000046244 00000 n -0000046356 00000 n -0000046480 00000 n -0000046603 00000 n -0000006128 00000 n -0000007364 00000 n -0000026121 00000 n -0000025982 00000 n -0000017746 00000 n -0000061775 00000 n -0000057506 00000 n -0000051182 00000 n -0000048500 00000 n -0000062135 00000 n -0000026272 00000 n -0000046820 00000 n -0000047529 00000 n -0000046852 00000 n -0000047752 00000 n -0000048656 00000 n -0000048858 00000 n -0000050118 00000 n -0000048931 00000 n -0000050349 00000 n -0000051345 00000 n -0000051554 00000 n -0000056012 00000 n -0000051839 00000 n -0000056242 00000 n -0000057669 00000 n -0000057878 00000 n -0000060560 00000 n -0000058064 00000 n -0000060783 00000 n -0000061932 00000 n -0000062199 00000 n -0000062321 00000 n +0000038934 00000 n +0000039045 00000 n +0000039144 00000 n +0000039302 00000 n +0000039437 00000 n +0000039550 00000 n +0000039708 00000 n +0000039819 00000 n +0000039929 00000 n +0000040035 00000 n +0000040141 00000 n +0000000487 00000 n +0000000542 00000 n +0000003013 00000 n +0000040242 00000 n +0000040357 00000 n +0000040493 00000 n +0000040619 00000 n +0000040756 00000 n +0000040866 00000 n +0000040991 00000 n +0000002122 00000 n +0000041129 00000 n +0000041255 00000 n +0000002188 00000 n +0000041393 00000 n +0000041493 00000 n +0000041626 00000 n +0000041735 00000 n +0000041861 00000 n +0000041987 00000 n +0000042125 00000 n +0000042251 00000 n +0000042377 00000 n +0000042503 00000 n +0000042612 00000 n +0000042738 00000 n +0000042864 00000 n +0000002260 00000 n +0000002320 00000 n +0000003883 00000 n +0000043002 00000 n +0000043117 00000 n +0000043253 00000 n +0000043364 00000 n +0000003194 00000 n +0000043502 00000 n +0000043628 00000 n +0000043739 00000 n +0000043865 00000 n +0000043951 00000 n +0000044061 00000 n +0000044187 00000 n +0000003280 00000 n +0000044348 00000 n +0000044457 00000 n +0000044583 00000 n +0000003335 00000 n +0000003395 00000 n +0000005872 00000 n +0000044721 00000 n +0000044836 00000 n +0000044952 00000 n +0000045078 00000 n +0000045204 00000 n +0000045330 00000 n +0000045462 00000 n +0000045559 00000 n +0000045696 00000 n +0000045822 00000 n +0000045948 00000 n +0000046074 00000 n +0000046172 00000 n +0000046281 00000 n +0000046407 00000 n +0000046516 00000 n +0000046654 00000 n +0000046780 00000 n +0000046904 00000 n +0000047001 00000 n +0000004064 00000 n +0000047139 00000 n +0000047277 00000 n +0000047403 00000 n +0000047527 00000 n +0000004130 00000 n +0000047688 00000 n +0000047814 00000 n +0000047952 00000 n +0000048078 00000 n +0000048202 00000 n +0000048299 00000 n +0000048436 00000 n +0000048562 00000 n +0000048723 00000 n +0000048821 00000 n +0000048918 00000 n +0000049016 00000 n +0000049113 00000 n +0000049211 00000 n +0000049337 00000 n +0000049435 00000 n +0000049532 00000 n +0000049630 00000 n +0000049727 00000 n +0000049825 00000 n +0000049922 00000 n +0000050032 00000 n +0000004254 00000 n +0000050163 00000 n +0000050302 00000 n +0000050400 00000 n +0000050489 00000 n +0000050628 00000 n +0000050726 00000 n +0000050815 00000 n +0000050954 00000 n +0000051052 00000 n +0000004372 00000 n +0000007184 00000 n +0000051141 00000 n +0000051256 00000 n +0000051461 00000 n +0000051578 00000 n +0000051716 00000 n +0000051854 00000 n +0000051992 00000 n +0000006053 00000 n +0000052130 00000 n +0000052256 00000 n +0000052394 00000 n +0000052532 00000 n +0000052649 00000 n +0000052787 00000 n +0000052925 00000 n +0000053063 00000 n +0000053201 00000 n +0000053327 00000 n +0000053465 00000 n +0000053591 00000 n +0000053717 00000 n +0000053855 00000 n +0000053992 00000 n +0000006129 00000 n +0000007365 00000 n +0000026173 00000 n +0000026034 00000 n +0000017798 00000 n +0000069179 00000 n +0000064910 00000 n +0000058586 00000 n +0000055904 00000 n +0000069539 00000 n +0000026324 00000 n +0000027024 00000 n +0000027936 00000 n +0000028878 00000 n +0000029840 00000 n +0000030568 00000 n +0000054224 00000 n +0000054933 00000 n +0000054256 00000 n +0000055156 00000 n +0000056060 00000 n +0000056262 00000 n +0000057522 00000 n +0000056335 00000 n +0000057753 00000 n +0000058749 00000 n +0000058958 00000 n +0000063416 00000 n +0000059243 00000 n +0000063646 00000 n +0000065073 00000 n +0000065282 00000 n +0000067964 00000 n +0000065468 00000 n +0000068187 00000 n +0000069336 00000 n +0000069603 00000 n +0000069725 00000 n trailer -<< /Size 264 /Root 262 0 R /Info 263 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> +<< /Size 274 /Root 272 0 R /Info 273 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> startxref -62466 +69870 %%EOF From 3bd184a3d1d4212143d6be50824d9182d028b5a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 1 Dec 2023 17:48:31 +0100 Subject: [PATCH 096/206] Note potential mismatch in legacy mappings --- luamml-legacy-mappings.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/luamml-legacy-mappings.lua b/luamml-legacy-mappings.lua index f4236ce..6a56b70 100644 --- a/luamml-legacy-mappings.lua +++ b/luamml-legacy-mappings.lua @@ -26,6 +26,7 @@ local remap_oml = { [0] = 0x1D465, 0x1D466, 0x1D467, 0x1D6A4, 0x1D6A5, 0x2118, 0x2192, nil, } +-- Something fishy here. Starting with "3D the entries seem wrong local remap_oms = { [0] = 0x2212, 0x22C5, 0xD7, 0x2A, 0xF7, 0x22C4, 0xB1, 0x2213, 0x2295, 0x2296, 0x2297, 0x2298, 0x2299, 0x25CB, 0x2218, 0x2219, @@ -34,7 +35,7 @@ local remap_oms = { [0] = 0x2190, 0x2192, 0x2191, 0x2193, 0x2194, 0x2197, 0x2198, 0x2243, 0x21D0, 0x21D2, 0x21D1, 0x21D3, 0x21D4, 0x2196, 0x2199, 0x221D, 0x2032, 0x221E, 0x2208, 0x220B, 0x25B3, 0x25BD, 0x0338, 0x21A6, - 0x2200, 0x2203, 0xAC, 0x2205, 0x211C, 0x22A9, 0x22A4, 0x22A5, + 0x2200, 0x2203, 0xAC, 0x2205, 0x211C, 0x2111, 0x22A4, 0x22A5, 0x2135, 0x1D49C, 0x212C, 0x1D49E, 0x1D49F, 0x2130, 0x2131, 0x1D4A2, 0x210B, 0x2110, 0x1D4A5, 0x1D4A6, 0x2112, 0x2133, 0x1D4A9, 0x1D4AA, 0x1D4AB, 0x1D4AC, 0x211B, 0x1D4AE, 0x1D4AF, 0x1D4B0, 0x1D4B1, 0x1D4B2, From 9005c304d767ab730a7c9df72114b9ef5de044fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 1 Dec 2023 17:50:15 +0100 Subject: [PATCH 097/206] Don't try to use expl3 box functions to access old 2e boxes in patches --- luamml-patches-kernel.sty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index e03a991..1c1540d 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -2,7 +2,7 @@ {Feel free to add a description here} \cs_new:Npn \__luamml_kernel_phantom:nnn #1#2#3 { - \hbox_set:Nn \c_zero_int { + \setbox \z@ = \hbox { $ \m@th #2 From 7a52f5580bba815c65eee3861d6888002aa53729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 19 Dec 2023 20:55:13 +0100 Subject: [PATCH 098/206] Fix XML escaping --- luamml-xmlwriter.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luamml-xmlwriter.lua b/luamml-xmlwriter.lua index 271fb07..cbdc1f1 100644 --- a/luamml-xmlwriter.lua +++ b/luamml-xmlwriter.lua @@ -10,7 +10,7 @@ local escapes = { ['&'] = "&", } local function escape_text(text) - return string.gsub(tostring(text), '("<>&)', escapes) + return string.gsub(tostring(text), '["<>&]', escapes) end local attrs = {} From 89f8e2a79ac8bb2825b3ba0b056742ff52340d02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 19 Dec 2023 21:35:33 +0100 Subject: [PATCH 099/206] Fix units for height and width in mspace --- luamml-convert.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index b67cf12..006f048 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -462,13 +462,13 @@ local function rule_to_table(rule, sub, cur_style) if height == running_length then height = '0.8em' else - height = height + height = string.format("%.3fpt", height/65781.76) end local depth = rule.depth if depth == running_length then depth = '0.2em' else - depth = depth + depth = string.format("%.3fpt", depth/65781.76) end return {[0] = 'mspace', mathbackground = 'currentColor', width = width, height = height, depth = depth}, space_like end From 637dfbf90aa681358e7b6fe1f0cba6e74e055ff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 19 Dec 2023 23:27:31 +0100 Subject: [PATCH 100/206] Escaping control characters --- luamml-xmlwriter.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/luamml-xmlwriter.lua b/luamml-xmlwriter.lua index cbdc1f1..47d4385 100644 --- a/luamml-xmlwriter.lua +++ b/luamml-xmlwriter.lua @@ -10,8 +10,11 @@ local escapes = { ['&'] = "&", } local function escape_text(text) - return string.gsub(tostring(text), '["<>&]', escapes) + return string.gsub(string.gsub(tostring(text), '["<>&]', escapes), '[\x00-\x08\x0B\x0C\x0E-\x20]', function(x) + return string.format('^^%02x', string.byte(x)) + end) end +print("", escape_text"") local attrs = {} local function write_elem(tree, indent) From 174cad050b1f6a4be1ff93f4e7e25363c4e84fe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 20 Dec 2023 19:22:21 +0100 Subject: [PATCH 101/206] Add LaTeX hook to intercept converted MathML --- luamml-tex.lua | 25 +++++++++++++++++++++++-- luamml-xmlwriter.lua | 2 +- luamml.dtx | 19 +++++++++++++++++-- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/luamml-tex.lua b/luamml-tex.lua index c391a0a..7c069c8 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -10,6 +10,10 @@ local write_struct = require'luamml-structelemwriter' local filename_token = token.create'l__luamml_filename_tl' local label_token = token.create'l__luamml_label_tl' +local left_brace = token.new(string.byte'{', 1) +local right_brace = token.new(string.byte'}', 2) + +local output_hook_token local properties = node.get_properties_table() local mmode, hmode, vmode do @@ -92,6 +96,11 @@ local function save_result(xml, display, structelem) if tracing then texio.write_nl(write_xml(mlist_result) .. '\n') end + if output_hook_token then + tex.runtoks(function() + tex.sprint(-2, output_hook_token, left_brace, write_xml(mlist_result), right_brace) + end) + end if tex.count.l__luamml_flag_int & 8 == 8 then write_struct(mlist_result) end @@ -166,7 +175,7 @@ lua.get_functions_table()[funcid] = function() end funcid = luatexbase.new_luafunction'luamml_begin_single_file:' -token.set_lua('luamml_begin_single_file:', funcid, protected) +token.set_lua('luamml_begin_single_file:', funcid, 'protected') lua.get_functions_table()[funcid] = function() token.put_next(filename_token) local filename = token.scan_argument() @@ -176,7 +185,7 @@ lua.get_functions_table()[funcid] = function() end funcid = luatexbase.new_luafunction'luamml_end_single_file:' -token.set_lua('luamml_end_single_file:', funcid, protected) +token.set_lua('luamml_end_single_file:', funcid, 'protected') lua.get_functions_table()[funcid] = function() if out_file then out_file:close() @@ -184,6 +193,18 @@ lua.get_functions_table()[funcid] = function() end end +funcid = luatexbase.new_luafunction'luamml_register_output_hook:N' +token.set_lua('__luamml_register_output_hook:N', funcid, 'protected') +lua.get_functions_table()[funcid] = function() + output_hook_token = token.get_next() +end + +funcid = luatexbase.new_luafunction'luamml_disable_output_hook:' +token.set_lua('__luamml_disable_output_hook:', funcid, 'protected') +lua.get_functions_table()[funcid] = function() + output_hook_token = nil +end + local annotate_context = require'luamml-tex-annotate' annotate_context.data.mathml = labelled_mathml diff --git a/luamml-xmlwriter.lua b/luamml-xmlwriter.lua index 47d4385..c68b79a 100644 --- a/luamml-xmlwriter.lua +++ b/luamml-xmlwriter.lua @@ -10,7 +10,7 @@ local escapes = { ['&'] = "&", } local function escape_text(text) - return string.gsub(string.gsub(tostring(text), '["<>&]', escapes), '[\x00-\x08\x0B\x0C\x0E-\x20]', function(x) + return string.gsub(string.gsub(tostring(text), '["<>&]', escapes), '[\x00-\x08\x0B\x0C\x0E-\x1F]', function(x) return string.format('^^%02x', string.byte(x)) end) end diff --git a/luamml.dtx b/luamml.dtx index 72b9561..5c18f49 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -99,6 +99,21 @@ % \begin{macrocode} %\lua_now:n { require'luamml-tex' } % \end{macrocode} +% +% \subsection{Hook} +% We also call a hook with arguments at the end of every MathML conversion with the result. +% Currently only implemented in Lua\TeX{} since it immediately provides the output. +% \begin{macrocode} +%<*luatex> +\hook_new_with_args:nn { luamml / converted } { 1 } + +\cs_new_protected:Npn \__luamml_output_hook:n { + \hook_use:nnw { luamml / converted } { 1 } +} +\__luamml_register_output_hook:N \__luamml_output_hook:n +% +% \end{macrocode} + % % \subsection{Flags} % The most important interface is for setting the flag which controls how the @@ -259,7 +274,7 @@ \cs_new_protected:Npn \luamml_annotate:nen #1#2#3 { \__luamml_annotate_begin: #3 - \__luamml_annotate_end:we \tex_numexpr:D #1 \scan_stop: {#2} + \__luamml_annotate_end:we \tex_numexpr:D #1 \scan_stop: {#2} } \cs_new_protected:Npn \luamml_annotate:en #1#2 { @@ -434,7 +449,7 @@ % \begin{macrocode} \cs_new_protected:Npn \__luamml_patch_package:nn #1 #2 { \@ifpackageloaded {#1} {#2} { - \hook_gput_code:nnn {package/after/#1} {luamml} {#2} + \hook_gput_code:nnn {package/#1/after} {luamml} {#2} } } \cs_new_protected:Npn \__luamml_patch_package:n #1 { From ae911c29aea40a62aaa7ce82b2933164e96a95a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 21 Dec 2023 02:31:11 +0100 Subject: [PATCH 102/206] Avoid attaching invalid attributes --- luamml-convert.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index 006f048..ec22b1c 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -266,8 +266,9 @@ local function noad_to_table(noad, sub, cur_style, joining, bin_replacements) if sub == noad_ord and not (bin_replacements[node.direct.todirect(noad)] or (nucleus == core and #core == 1 and always_mo[core[1]])) then if core and core[0] == 'mo' then core['tex:class'] = nil - if not core.minsize then + if not core.minsize and not core.movablelimits then core[0] = 'mi' + core.movablelimits = nil core.mathvariant = #core == 1 and type(core[1]) == 'string' and utf8.len(core[1]) == 1 and utf8.codepoint(core[1]) < 0x10000 and 'normal' or nil core.stretchy, core.lspace, core.rspace = nil end @@ -312,7 +313,7 @@ local function noad_to_table(noad, sub, cur_style, joining, bin_replacements) nucleus['tex:class'] = noad_names[sub] if (noad.sup or noad.sub) and (sub == noad_op or sub == noad_oplimits) then - nucleus.movablelimits = sub == noad_op + if core and core[0] == 'mo' then core.movablelimits = sub == noad_op end local sub = kernel_to_table(noad.sub, sub_style(cur_style)) local sup = kernel_to_table(noad.sup, sup_style(cur_style)) return {[0] = sup and (sub and 'munderover' or 'mover') or 'munder', From 9c43b613879909969235f89ba71b32f9cc555732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 21 Dec 2023 02:58:13 +0100 Subject: [PATCH 103/206] Remove debugging output --- luamml-xmlwriter.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/luamml-xmlwriter.lua b/luamml-xmlwriter.lua index c68b79a..78a692c 100644 --- a/luamml-xmlwriter.lua +++ b/luamml-xmlwriter.lua @@ -14,7 +14,6 @@ local function escape_text(text) return string.format('^^%02x', string.byte(x)) end) end -print("", escape_text"") local attrs = {} local function write_elem(tree, indent) From 9b85cdb610eb4050764821c2f9bce07b8d84a53d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 23 Dec 2023 11:55:31 +0100 Subject: [PATCH 104/206] Don't serialize namespaced attributes into XML --- luamml-xmlwriter.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/luamml-xmlwriter.lua b/luamml-xmlwriter.lua index 78a692c..a2b5abe 100644 --- a/luamml-xmlwriter.lua +++ b/luamml-xmlwriter.lua @@ -20,9 +20,12 @@ local function write_elem(tree, indent) if not tree[0] then print('ERR', require'inspect'(tree)) end local escaped_name = escape_name(assert(tree[0])) local i = 0 - for attr, val in next, tree do if type(attr) == 'string' and string.byte(attr) ~= 0x3A then - i = i + 1 - attrs[i] = string.format(' %s="%s"', escape_name(attr), escape_text(val)) + for attr, val in next, tree do if type(attr) == 'string' then + if not string.find(attr, ':', 1, true) then + -- if string.byte(attr) ~= 0x3A then + i = i + 1 + attrs[i] = string.format(' %s="%s"', escape_name(attr), escape_text(val)) + end end end table.sort(attrs) local out = string.format('%s<%s%s', indent or '', escaped_name, table.concat(attrs)) From e6d7b73beb54be7e588d9d723d146e31146a3327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 27 Dec 2023 13:30:40 +0100 Subject: [PATCH 105/206] Make text_families more dynamic --- luamml-convert.lua | 59 ++++++++++++++++++++++------------------------ luamml-tex.lua | 8 +++---- pdfmml.lua | 4 +++- 3 files changed, 35 insertions(+), 36 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index ec22b1c..bdd4684 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -112,8 +112,6 @@ local always_mo = {["%"] = true, ["&"] = true, ["."] = true, ["/"] = true, -- Marker tables replacing the core operator for space like elements local space_like = {} -local text_families = {} - local nodes_to_table local function sub_style(s) return s//4*2+5 end @@ -179,7 +177,7 @@ local function acc_to_table(acc, cur_style, stretch) end end -local function kernel_to_table(kernel, cur_style) +local function kernel_to_table(kernel, cur_style, text_families) if not kernel then return end local props = properties[kernel] local mathml_core = props and props.mathml_core @@ -216,18 +214,18 @@ local function kernel_to_table(kernel, cur_style) end elseif id == sub_mlist_t then if mathml_filter then - return mathml_filter(nodes_to_table(kernel.list, cur_style)) + return mathml_filter(nodes_to_table(kernel.list, cur_style, text_families)) else - return nodes_to_table(kernel.list, cur_style) + return nodes_to_table(kernel.list, cur_style, text_families) end else error'confusion' end end -local function do_sub_sup(t, core, n, cur_style) - local sub = kernel_to_table(n.sub, sub_style(cur_style)) - local sup = kernel_to_table(n.sup, sup_style(cur_style)) +local function do_sub_sup(t, core, n, cur_style, text_families) + local sub = kernel_to_table(n.sub, sub_style(cur_style), text_families) + local sup = kernel_to_table(n.sup, sup_style(cur_style), text_families) if sub then if sup then return {[0] = 'msubsup', t, sub, sup}, core @@ -256,8 +254,8 @@ local function maybe_to_mn(noad, core) core[0] = 'mn' end -local function noad_to_table(noad, sub, cur_style, joining, bin_replacements) - local nucleus, core = kernel_to_table(noad.nucleus, sub == noad_over and cur_style//2*2+1 or cur_style) +local function noad_to_table(noad, sub, cur_style, joining, bin_replacements, text_families) + local nucleus, core = kernel_to_table(noad.nucleus, sub == noad_over and cur_style//2*2+1 or cur_style, text_families) if not nucleus then return end if core and core[0] == 'mo' and core.minsize and not core.maxsize then core.maxsize = core.minsize -- This happens when a half-specified delimiter appears alone in a list. @@ -287,7 +285,7 @@ local function noad_to_table(noad, sub, cur_style, joining, bin_replacements) joining[':nodes'] = cnodes end end - nucleus = do_sub_sup(joining, joining, noad, cur_style) + nucleus = do_sub_sup(joining, joining, noad, cur_style, text_families) if nucleus == joining then return nil, joining, joining else @@ -314,8 +312,8 @@ local function noad_to_table(noad, sub, cur_style, joining, bin_replacements) if (noad.sup or noad.sub) and (sub == noad_op or sub == noad_oplimits) then if core and core[0] == 'mo' then core.movablelimits = sub == noad_op end - local sub = kernel_to_table(noad.sub, sub_style(cur_style)) - local sup = kernel_to_table(noad.sup, sup_style(cur_style)) + local sub = kernel_to_table(noad.sub, sub_style(cur_style), text_families) + local sup = kernel_to_table(noad.sup, sup_style(cur_style), text_families) return {[0] = sup and (sub and 'munderover' or 'mover') or 'munder', nucleus, sub or sup, @@ -336,11 +334,11 @@ local function noad_to_table(noad, sub, cur_style, joining, bin_replacements) else error[[confusion]] end - return do_sub_sup(nucleus, core, noad, cur_style) + return do_sub_sup(nucleus, core, noad, cur_style, text_families) end -local function accent_to_table(accent, sub, cur_style) - local nucleus, core = kernel_to_table(accent.nucleus, cur_style//2*2+1) +local function accent_to_table(accent, sub, cur_style, text_families) + local nucleus, core = kernel_to_table(accent.nucleus, cur_style//2*2+1, text_families) local top_acc = acc_to_table(accent.accent, cur_style, sub & 1 == 1) local bot_acc = acc_to_table(accent.bot_accent, cur_style, sub & 2 == 2) return {[0] = top_acc and (bot_acc and 'munderover' or 'mover') or 'munder', @@ -362,9 +360,9 @@ style_table.crampedscript, style_table.crampedscriptscript = style_table.display, style_table.text, style_table.script, style_table.scriptscript -local function radical_to_table(radical, sub, cur_style) +local function radical_to_table(radical, sub, cur_style, text_families) local kind = radical_sub[sub] - local nucleus, core = kernel_to_table(radical.nucleus, cur_style//2*2+1) + local nucleus, core = kernel_to_table(radical.nucleus, cur_style//2*2+1, text_families) local left = delim_to_table(radical.left) local elem if kind == 'radical' or kind == 'uradical' then @@ -372,7 +370,7 @@ local function radical_to_table(radical, sub, cur_style) elem, core = {[0] = 'msqrt', nucleus, }, nil elseif kind == 'uroot' then -- FIXME: Check that this is really a root - elem, core = {[0] = 'msqrt', nucleus, kernel_to_table(radical.degree)}, nil + elem, core = {[0] = 'msqrt', nucleus, kernel_to_table(radical.degree, 7, text_families)}, nil elseif kind == 'uunderdelimiter' then elem, core = {[0] = 'munder', left, nucleus}, left elseif kind == 'uoverdelimiter' then @@ -384,12 +382,12 @@ local function radical_to_table(radical, sub, cur_style) else error[[confusion]] end - return do_sub_sup(elem, core, radical, cur_style) + return do_sub_sup(elem, core, radical, cur_style, text_families) end -local function fraction_to_table(fraction, sub, cur_style) - local num, core = kernel_to_table(fraction.num, cur_style + 2 - cur_style//6*2) - local denom = kernel_to_table(fraction.denom, cur_style//2*2 + 3 - cur_style//6*2) +local function fraction_to_table(fraction, sub, cur_style, text_families) + local num, core = kernel_to_table(fraction.num, cur_style + 2 - cur_style//6*2, text_families) + local denom = kernel_to_table(fraction.denom, cur_style//2*2 + 3 - cur_style//6*2, text_families) local left = delim_to_table(fraction.left) local right = delim_to_table(fraction.right) local mfrac = {[0] = 'mfrac', @@ -519,7 +517,7 @@ local function cleanup_mathbin(head) return replacements end -function nodes_to_table(head, cur_style) +function nodes_to_table(head, cur_style, text_families) local bin_replacements = cleanup_mathbin(head) local t = {[0] = 'mrow'} local result = t @@ -534,7 +532,7 @@ function nodes_to_table(head, cur_style) new_node, new_core = mathml_table, mathml_core elseif id == noad_t then local new_n - new_n, new_core, new_joining = noad_to_table(n, sub, cur_style, joining, bin_replacements) + new_n, new_core, new_joining = noad_to_table(n, sub, cur_style, joining, bin_replacements, text_families) if new_joining == false then t[#t], new_joining = new_n, nil else @@ -542,7 +540,7 @@ function nodes_to_table(head, cur_style) end new_noad = sub elseif id == accent_t then - new_node, new_core = accent_to_table(n, sub, cur_style) + new_node, new_core = accent_to_table(n, sub, cur_style, text_families) new_noad = noad_ord elseif id == style_t then if sub ~= cur_style then @@ -567,12 +565,12 @@ function nodes_to_table(head, cur_style) or size == 1 and 'text' or size == 2 and 'script' or size == 3 and 'scriptscript' - or assert(false)], 2*size), space_like + or assert(false)], 2*size, text_families), space_like elseif id == radical_t then - new_node, new_core = radical_to_table(n, sub, cur_style) + new_node, new_core = radical_to_table(n, sub, cur_style, text_families) new_noad = noad_ord elseif id == fraction_t then - new_node, new_core = fraction_to_table(n, sub, cur_style) + new_node, new_core = fraction_to_table(n, sub, cur_style, text_families) new_noad = noad_inner elseif id == fence_t then new_node, new_core = fence_to_table(n, sub, cur_style) @@ -658,7 +656,6 @@ end return { register_family = register_remap, - register_text_family = function(fam) text_families[fam] = true end, - process = function(head, style) return nodes_to_table(head, style or 2) end, + process = function(head, style, families) return nodes_to_table(head, style or 2, families) end, make_root = to_math, } diff --git a/luamml-tex.lua b/luamml-tex.lua index 7c069c8..b901f76 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -2,7 +2,6 @@ local mlist_to_mml = require'luamml-convert' local process_mlist = mlist_to_mml.process local make_root = mlist_to_mml.make_root local register_family = mlist_to_mml.register_family -local register_text_family = mlist_to_mml.register_text_family local mappings = require'luamml-legacy-mappings' local write_xml = require'luamml-xmlwriter' @@ -14,6 +13,7 @@ local left_brace = token.new(string.byte'{', 1) local right_brace = token.new(string.byte'}', 2) local output_hook_token +local text_families = {} local properties = node.get_properties_table() local mmode, hmode, vmode do @@ -44,8 +44,8 @@ local funcid = luatexbase.new_luafunction'RegisterFamilyMapping' token.set_lua('RegisterTextFamily', funcid, 'protected') lua.get_functions_table()[funcid] = function() local fam = token.scan_int() - local kind = token.scan_string() - register_text_family(fam, kind) + local _kind = token.scan_string() + text_families[fam] = true end local function shallow_copy(t) @@ -118,7 +118,7 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) local display = style == 'display' local startmath = tex.nest.top.tail -- Must come before any write_struct calls which adds nodes style = flag & 16 == 16 and flag>>5 & 0x7 or display and 0 or 2 - local xml, core = process_mlist(mlist, style) + local xml, core = process_mlist(mlist, style, text_families) if flag & 2 == 2 then xml = save_result(shallow_copy(xml), display) end diff --git a/pdfmml.lua b/pdfmml.lua index 7a0aac2..c61b018 100755 --- a/pdfmml.lua +++ b/pdfmml.lua @@ -7,6 +7,8 @@ local to_xml = require'luamml-xmlwriter' local parse_showlists = require'pdfmml-showlists' local parse_log = require'pdfmml-logreader' +local text_families = {} + local attributes = lfs.attributes local function try_extensions_(base, extension, ...) if extension == nil then return end @@ -71,7 +73,7 @@ for i, block in ipairs(parsed.groups) do block = block[1] if flag & 3 ~= 0 then local style = flag & 16 == 16 and flag>>5 & 0x7 or block.display and 0 or 2 - local xml = convert.process(parse_showlists(block, nil, nil, parsed), style) + local xml = convert.process(parse_showlists(block, nil, nil, parsed), style, text_families) if flag & 2 == 2 then local stream = out_stream or assert(io.open(out_prefix .. tostring(i) .. out_suffix, 'w')) stream:write(to_xml(convert.make_root(shallow_copy(xml), style)), '\n') From 3c033069f36646d8e4221469df3083ac1de50900 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 27 Dec 2023 15:32:27 +0100 Subject: [PATCH 106/206] Automatically try to detect text fonts --- luamml-tex.lua | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/luamml-tex.lua b/luamml-tex.lua index b901f76..7a85de7 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -13,7 +13,22 @@ local left_brace = token.new(string.byte'{', 1) local right_brace = token.new(string.byte'}', 2) local output_hook_token -local text_families = {} +local global_text_families = {} +local text_families = setmetatable({}, {__index = function(t, fam) + if fam == nil then return nil end + local assignment = global_text_families[fam] + if assignment == nil then + local fid = node.family_font(fam) + local fontdir = font.getfont(fid) + if not fontdir then + -- FIXME(?): If there is no font... + error'Please load your fonts?!?' + end + assignment = not fontdir.MathConstants + end + t[fam] = assignment + return assignment +end}) local properties = node.get_properties_table() local mmode, hmode, vmode do @@ -45,7 +60,7 @@ token.set_lua('RegisterTextFamily', funcid, 'protected') lua.get_functions_table()[funcid] = function() local fam = token.scan_int() local _kind = token.scan_string() - text_families[fam] = true + global_text_families[fam] = true end local function shallow_copy(t) From f4c0721401c2d8f408b2b4506f1cca15babd9dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 27 Dec 2023 17:45:39 +0100 Subject: [PATCH 107/206] Reset family assignments between math blocks --- luamml-tex.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/luamml-tex.lua b/luamml-tex.lua index 7a85de7..a399db4 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -14,7 +14,7 @@ local right_brace = token.new(string.byte'}', 2) local output_hook_token local global_text_families = {} -local text_families = setmetatable({}, {__index = function(t, fam) +local text_families_meta = {__index = function(t, fam) if fam == nil then return nil end local assignment = global_text_families[fam] if assignment == nil then @@ -28,7 +28,7 @@ local text_families = setmetatable({}, {__index = function(t, fam) end t[fam] = assignment return assignment -end}) +end} local properties = node.get_properties_table() local mmode, hmode, vmode do @@ -133,7 +133,7 @@ luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style) local display = style == 'display' local startmath = tex.nest.top.tail -- Must come before any write_struct calls which adds nodes style = flag & 16 == 16 and flag>>5 & 0x7 or display and 0 or 2 - local xml, core = process_mlist(mlist, style, text_families) + local xml, core = process_mlist(mlist, style, setmetatable({}, text_families_meta)) if flag & 2 == 2 then xml = save_result(shallow_copy(xml), display) end From 7341dd5fc63fe026f767b8d95116ff8cc035beed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 27 Dec 2023 18:14:46 +0100 Subject: [PATCH 108/206] Improve detection --- luamml-convert.lua | 2 +- luamml-tex.lua | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index bdd4684..51996d2 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -273,7 +273,7 @@ local function noad_to_table(noad, sub, cur_style, joining, bin_replacements, te end if nucleus == core and #core == 1 then if joining and joining[0] == 'mn' and core[0] == 'mi' and (core[1] == '.' or core[1] == ',') and maybe_to_mn(noad, core) - or core[0] == 'mn' or text_families[core['tex:family']] then + or core[0] == 'mn' or text_families[core['tex:family'] or 0] then if joining and core[0] == joining[0] and core['tex:family'] == joining['tex:family'] then joining[#joining+1] = core[1] local cnodes = core[':nodes'] diff --git a/luamml-tex.lua b/luamml-tex.lua index a399db4..d6cee83 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -24,7 +24,7 @@ local text_families_meta = {__index = function(t, fam) -- FIXME(?): If there is no font... error'Please load your fonts?!?' end - assignment = not fontdir.MathConstants + assignment = not (fontdir.MathConstants and next(fontdir.MathConstants)) end t[fam] = assignment return assignment @@ -50,6 +50,9 @@ lua.get_functions_table()[funcid] = function() local mapping = token.scan_string() if mappings[mapping] then register_family(fam, mappings[mapping]) + if global_text_families[fam] == nil then + global_text_families[fam] = false + end else tex.error(string.format('Unknown font mapping %q', mapping)) end From be474c633a417866926593df2d8fc1a6c41d801b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 4 Apr 2024 16:10:35 +0200 Subject: [PATCH 109/206] Fix documentation --- luamml.dtx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/luamml.dtx b/luamml.dtx index 5c18f49..621bfb5 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -242,6 +242,7 @@ } % % \end{macrocode} +% \end{macro} % % \begin{macro}{\luamml_begin_single_file:, \luamml_end_single_file:} % Everything between these two commands gets written into the same XML file. @@ -433,6 +434,7 @@ } % % \end{macrocode} +% \end{macro} % % % \subsection{Patching} From e74bca7eacd6524bde2ebfa79533ddce9fa8289a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 16 Jul 2024 09:11:07 +0200 Subject: [PATCH 110/206] Add patches for latex-lab math compatibility --- luamml-patches-amsmath.sty | 2 +- luamml-patches-kernel.sty | 4 ++++ luamml-patches-lab-math.sty | 30 ++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 luamml-patches-lab-math.sty diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 733b71b..f3bfc38 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -264,7 +264,7 @@ \restorealignstate@ \egroup \nonumber - \ifnum0=โ€˜{\fi\iffalse}\fi + \ifnum0=`{\fi\iffalse}\fi \else $$ \fi diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index 1c1540d..49dc215 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -57,3 +57,7 @@ \__luamml_kernel_define_character:Nnn \longleftrightarrow {3} {27f7} \__luamml_kernel_define_character:Nnn \longmapsto {4} {27fc} } + +\IfFileLoadedT {latex-lab-math.ltx} { + \RequirePackage{luamml-patches-lab-math} +} diff --git a/luamml-patches-lab-math.sty b/luamml-patches-lab-math.sty new file mode 100644 index 0000000..b3cc27e --- /dev/null +++ b/luamml-patches-lab-math.sty @@ -0,0 +1,30 @@ +\ProvidesExplPackage {luamml-patches-lab-math} {2021-05-30} {0.0.1-alpha} + {Feel free to add a description here} + +\AddToHook{begindocument} { + \cs_set:Npn \common@align@ending { + \math@cr + \black@ \totwidth@ + \__luamml_amsmath_finalize_table:n {align} + \egroup + \ifingather@ + \restorealignstate@ + \egroup + \nonumber + \ifnum0=`{\fi\iffalse}\fi + \else + $$ + \fi + \ignorespacesafterend + } + \show \__math_env_gather_end: + \show \endgather + % \cs_set:Npn \endgather { + % \math@cr + % \black@ \totwidth@ + % \__luamml_amsmath_finalize_table:n {gather} + % \egroup + % $$ + % \ignorespacesafterend + % } +} From 413ec0112a504a28a2e9e0d487fa091cb9fa7093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 17 Jul 2024 19:36:49 +0200 Subject: [PATCH 111/206] Stop emitting intent="@ignore" --- luamml-convert.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/luamml-convert.lua b/luamml-convert.lua index 51996d2..fe529de 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -616,9 +616,10 @@ function nodes_to_table(head, cur_style, text_families) end joining = new_joining end - -- In TeX, groups are never space like + -- In TeX, groups are never space like, so we insert an artificial node instead. + -- This node should be ignored for most purposes if core == space_like then - core = {[0] = 'mi', intent = '@ignore'} + core = {[0] = 'mi', ['tex:ignore'] = 'true'} result[#result+1] = core end if t[0] == 'mrow' and #t == 1 then From 62bab631777464e30129d817edf1c435a3b449ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 18 Jul 2024 12:53:06 +0200 Subject: [PATCH 112/206] Drop \show statements --- luamml-patches-lab-math.sty | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/luamml-patches-lab-math.sty b/luamml-patches-lab-math.sty index b3cc27e..166a7d0 100644 --- a/luamml-patches-lab-math.sty +++ b/luamml-patches-lab-math.sty @@ -17,14 +17,4 @@ \fi \ignorespacesafterend } - \show \__math_env_gather_end: - \show \endgather - % \cs_set:Npn \endgather { - % \math@cr - % \black@ \totwidth@ - % \__luamml_amsmath_finalize_table:n {gather} - % \egroup - % $$ - % \ignorespacesafterend - % } } From 1a19e3947a5c6b6076514d7bab9b6ae8be5cbb3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 14 Aug 2024 00:30:56 +0200 Subject: [PATCH 113/206] Add \l__luamml_pretty_int to control prettyprinting --- luamml-tex.lua | 10 +++++----- luamml.dtx | 3 +++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/luamml-tex.lua b/luamml-tex.lua index d6cee83..4182fbb 100644 --- a/luamml-tex.lua +++ b/luamml-tex.lua @@ -100,23 +100,23 @@ local labelled_mathml = {} local function save_result(xml, display, structelem) mlist_result = make_root(xml, display and 0 or 2) if out_file then - out_file:write(write_xml(mlist_result, true):sub(2) .. '\n') + out_file:write(write_xml(mlist_result, tex.count.l__luamml_pretty_int & 1 == 1):sub(2) .. '\n') else token.put_next(filename_token) local filename = token.scan_argument() if filename ~= '' then assert(io.open(filename, 'w')) - :write(write_xml(mlist_result, true):sub(2) .. '\n') + :write(write_xml(mlist_result, tex.count.l__luamml_pretty_int & 1 == 1):sub(2) .. '\n') :close() end end local tracing = tex.count.tracingmathml > 1 if tracing then - texio.write_nl(write_xml(mlist_result) .. '\n') + texio.write_nl(write_xml(mlist_result, tex.count.l__luamml_pretty_int & 2 == 2) .. '\n') end if output_hook_token then tex.runtoks(function() - tex.sprint(-2, output_hook_token, left_brace, write_xml(mlist_result), right_brace) + tex.sprint(-2, output_hook_token, left_brace, write_xml(mlist_result, tex.count.l__luamml_pretty_int & 4 == 4), right_brace) end) end if tex.count.l__luamml_flag_int & 8 == 8 then @@ -184,7 +184,7 @@ lua.get_functions_table()[funcid] = function() "I was asked to provide MathML code for the last formula, but there weren't any new formulas since you last asked." }) end - local mml = write_xml(mlist_result) + local mml = write_xml(mlist_result, tex.count.l__luamml_pretty_int & 8 == 8) if tex.count.tracingmathml == 1 then texio.write_nl(mml .. '\n') end diff --git a/luamml.dtx b/luamml.dtx index 621bfb5..d2134b2 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -85,12 +85,15 @@ % them later. % \begin{macrocode} \int_new:N \l__luamml_flag_int +\int_new:N \l__luamml_pretty_int %\tl_new:N \l__luamml_filename_tl \tl_new:N \l__luamml_root_tl \tl_set:Nn \l__luamml_root_tl { mrow } \tl_new:N \l__luamml_label_tl %\int_new:N \g__luamml_formula_id_int %\int_new:N \tracingmathml + +\int_set:Nn \l__luamml_pretty_int { 1 } % \end{macrocode} % % Now we can load the Lua module which defines the callback. From bae4f782bba1abae03b72c93453cac8ff6c395c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 14 Aug 2024 20:10:21 +0200 Subject: [PATCH 114/206] Prepare for first upload --- README.md | 14 +- build.lua | 2 + luamml-demo.sty | 2 +- luamml-patches-amsmath.sty | 2 +- luamml-patches-amstext.sty | 2 +- luamml-patches-array.sty | 2 +- luamml-patches-kernel.sty | 2 +- luamml-patches-lab-math.sty | 2 +- luamml-pdf-demo.sty | 2 +- luamml.dtx | 58 +- algorithm.tex => support/luamml-algorithm.tex | 55 +- testfiles-lua/cases.mlr | 102 +- testfiles-lua/test_struct.tpf | 1551 ++++++++--------- testfiles-lua/test_xml.mlr | 106 +- testfiles-pdf/test.mlr | 78 +- 15 files changed, 986 insertions(+), 994 deletions(-) rename algorithm.tex => support/luamml-algorithm.tex (60%) diff --git a/README.md b/README.md index d139829..afdf86e 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,14 @@ -# Automated LuaLaTeX math to MathML conversion -**Highly experimental! At this point all interfaces may change without prior warning and many features aren't implemented yet. It is not ready for anything beyond simple experiments.** - +# LuaMML: Automated LuaLaTeX math to MathML conversion This is an attempt to implement automatic conversion of LuaLaTeX inline and display math expressions into MathML code to aid with tagging. It works best with `unicode-math`, but it can also be used with traditional math fonts if mappings to Unicode are provided. ## Installation Run `l3build install` to install `luamml` into your local `texmf` tree. -## Demo -Run `lualatex test_tex` to see all equations from [our example file](./test_tex.tex) converted into MathML. +## Usage +Add `\usepackage[tracing]{luamml-demo}` to print MathML to the terminal or `\usepackage[files]{luamml-demo}` to generate separate files with MathML output. +Alternatively it can be used with latex-lab to automatically integrate with tagging infrastucture. -To test it on your own files, add `\usepackage[tracing]{luamml-demo}` (to print MathML to the terminal) or `\usepackage[files]{luamml-demo}` to generate separate files with MathML output. -Also see a [`tagpdf` experiment using this to tag PDF formulas](https://github.com/u-fischer/tagpdf/blob/develop/experiments/exp-mathml-lua.tex). + -If you are very brave you can also try running `pdflatex test_pdf` and afterwards run `./pdfmml.lua test_pdf.lua` to get pdflatex formulas converted. + diff --git a/build.lua b/build.lua index 1485bf5..553d44d 100644 --- a/build.lua +++ b/build.lua @@ -3,6 +3,8 @@ module = "luamml" tdsroot = "lualatex" installfiles = { "luamml-*.lua", "*.sty" } sourcefiles = { "luamml-*.lua", "*.sty", "*.dtx" } +typesetsuppfiles = { "*.tex" } +typesetsourcefiles = { "*.tex" } stdengine = "luatex" unpackfiles = { "*.dtx" } typesetexe = "lualatex" diff --git a/luamml-demo.sty b/luamml-demo.sty index 5e2d8df..64e4e3f 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -1,5 +1,5 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesExplPackage{luamml-demo}{2021-06-16}{v0.0.1}{Reasonable default definitions for luamml} +\ProvidesExplPackage{luamml-demo}{2024-08-14}{v0.1.0}{Reasonable default definitions for luamml} \sys_if_engine_luatex:F { \msg_new:nnn {luamml-demo} {pdftex-option-ignored} {Option~`#1'~is~being~ignored~in~pdfTeX~mode.} diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index f3bfc38..c0df5ed 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-amsmath} {2021-04-23} {0.0.1-alpha} +\ProvidesExplPackage {luamml-patches-amsmath} {2024-08-14} {0.1.0} {Feel free to add a description here} \lua_now:n { require'luamml-amsmath' } diff --git a/luamml-patches-amstext.sty b/luamml-patches-amstext.sty index 2850257..2217600 100644 --- a/luamml-patches-amstext.sty +++ b/luamml-patches-amstext.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-amstext} {2021-04-23} {0.0.1-alpha} +\ProvidesExplPackage {luamml-patches-amstext} {2024-08-14} {0.1.0} {Feel free to add a description here} \int_new:N \g__luamml_amsmath_text_struct_int diff --git a/luamml-patches-array.sty b/luamml-patches-array.sty index 7635323..ee40b2c 100644 --- a/luamml-patches-array.sty +++ b/luamml-patches-array.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-array} {2021-04-23} {0.0.1-alpha} +\ProvidesExplPackage {luamml-patches-array} {2024-08-14} {0.1.0} {Feel free to add a description here} \lua_now:n { require'luamml-array' } diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index 49dc215..fa3aaae 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-kernel} {2021-05-30} {0.0.1-alpha} +\ProvidesExplPackage {luamml-patches-kernel} {2024-08-14} {0.1.0} {Feel free to add a description here} \cs_new:Npn \__luamml_kernel_phantom:nnn #1#2#3 { diff --git a/luamml-patches-lab-math.sty b/luamml-patches-lab-math.sty index 166a7d0..e2d12c3 100644 --- a/luamml-patches-lab-math.sty +++ b/luamml-patches-lab-math.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-lab-math} {2021-05-30} {0.0.1-alpha} +\ProvidesExplPackage {luamml-patches-lab-math} {2024-08-14} {0.1.0} {Feel free to add a description here} \AddToHook{begindocument} { diff --git a/luamml-pdf-demo.sty b/luamml-pdf-demo.sty index 0cd981d..fe63814 100644 --- a/luamml-pdf-demo.sty +++ b/luamml-pdf-demo.sty @@ -1,5 +1,5 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesExplPackage{luamml-pdf-demo}{2021-06-16}{v0.0.1}{Reasonable default definitions for luamml-pdf} +\ProvidesExplPackage{luamml-pdf-demo}{2024-08-14}{v0.1.0}{Reasonable default definitions for luamml-pdf} \RequirePackage{luamml-pdf}% Loading luamml-pdf is pretty much the point % \RequirePackage{amsmath,array}% May come back if the patches get ported diff --git a/luamml.dtx b/luamml.dtx index d2134b2..0af076c 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% Copyright (C) 2020-2021 by Marcel Krueger +%% Copyright (C) 2020-2024 by Marcel Krueger %% %% This file may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either @@ -35,6 +35,7 @@ \documentclass{l3doc} \usepackage{luamml} \usepackage{csquotes,luacolor} +\MakeShortVerb{\|} \RecordChanges \begin{document} \tracingmathml2 @@ -48,13 +49,60 @@ % % \fi % -% \title{The \pkg{luamml} package} -% +% \GetFileInfo{luamml.dtx} +% \title{The \pkg{luamml} package% +% \thanks{This doument corresponds to \pkg{luamml}~\fileversion, dated~\filedate.}% +% } % \author{Marcel Krรผger} % % \maketitle % % \begin{documentation} +% \section{Use case} +% When generating output for the web or tagged output, mathematical content should often be represented as MathML. +% This uses Lua\TeX~callbacks to automatically attempt to convert Lua\TeX~math mode output into MathML. +% +% \section{Usage} +% The \pkg{luamml} package is designed to be used in automated ways by other packages and usually should not be invoked directly by the end user. +% For experiments, \texttt{luamml-demo} is included which provides easier to use interfaces. +% +% Add in your preamble +% \begin{verbatim} +% \usepackage[files]{luamml-demo} +% \end{verbatim} +% This will trigger the output of individual files for each block of math output containing corresponding MathML. +% +% Alternatively +% \begin{verbatim} +% \usepackage[l3build]{luamml-demo} +% \end{verbatim} +% will generate a single file witha concatenation of all MathML blocks. +% +% For automated use, the \pkg{luamml} package can be included directly, followed by enclosing blocks which should generate files with \cmd{luamml_begin_single_file:} and \cmd{luamml_end_single_file:}. +% The filename can be set with \cmd{luamml_set_filename:n}. +% +% \section{Improving MathML conversion} +% When using constructs which do not automatically get converted in acceptable form, conversion hints can be provided with \cmd{luamml_annotate:en}. +% This allows to provide a replacement MathML structure in Lua table form, for example +% \begin{verbatim} +% \luamml_annotate:en { +% nucleus = true, +% core = {[0] = 'mi', 'TeX'}, +% }{ +% \hbox{\TeX} +% } +% \end{verbatim} +% produces a |TeX| element in the output instead of trying to import \TeX~as a mathematical expression. +% The table structure is explaned in an appendix. +% +% \section{Features \& Limitiations} +% Currently all mathematical expressions which purely contain Unicode encoded math mode material without embedded non-math should get converted successfully. +% Usage with non-Unicode math (\TeX's 8-bit math fonts) is highly experimental and undocumented. +% Any attempt to build complicated structures by embedding arbitrary \TeX\ code in the middle of math mode needs to have a MathML replacement specified. +% We try to automate more cases in the future. +% +% \appendix +% \input{luamml-algorithm} % \end{documentation} % % \begin{implementation} @@ -66,11 +114,11 @@ % \begin{macrocode} %<@@=luamml> %<*luatex> -\ProvidesExplPackage {luamml} {2021-04-23} {0.0.1-alpha} +\ProvidesExplPackage {luamml} {2024-08-14} {0.1.0} {Automatically generate presentational MathML from LuaTeX math expressions} % %<*pdftex> -\ProvidesExplPackage {luamml-pdf} {2021-05-31} {0.0.1-alpha} +\ProvidesExplPackage {luamml-pdf} {2024-08-14} {0.1.0} {MathML generation for LฬถuฬถaฬถpdfLaTeX} % % \end{macrocode} diff --git a/algorithm.tex b/support/luamml-algorithm.tex similarity index 60% rename from algorithm.tex rename to support/luamml-algorithm.tex index eb71f74..507a0bd 100644 --- a/algorithm.tex +++ b/support/luamml-algorithm.tex @@ -1,10 +1,7 @@ -\documentclass{article} -\begin{document} -\title{From math lists to MathML} -\subtitle{The algorithm in luamml} -\author{Marcel} -\maketitle -\section{General concepts} +\newcommand\Luamml{\pkg{Luamml}} +\newcommand\luamml{\pkg{luamml}} +\newcommand\xmltag[1]{\texttt{<#1>}} +\section{\Luamml's representation of XML and MathML} In the following I assume basic familiarity with both Lua\TeX's representation of math noads and MathML. \subsection{Representation of XML elements} @@ -35,32 +32,32 @@ MathML knows the concept of \enquote{embellished operators}: \begin{blockquote} The precise definition of an \enquote{embellished operator} is: \begin{itemize} - \item an \tag{mo} element; - \item or one of the elements \tag{msub}, \tag{msup}, \tag{msubsup}, \tag{munder}, \tag{mover}, \tag{munderover}, \tag{mmultiscripts}, \tag{mfrac}, or \tag{semantics} (ยง 5.1 Annotation Framework), whose first argument exists and is an embellished operator; - \item or one of the elements \tag{mstyle}, \tag{mphantom}, or \tag{mpadded}, such that an mrow containing the same arguments would be an embellished operator; - \item or an \tag{maction} element whose selected sub-expression exists and is an embellished operator; - \item or an \tag{mrow} whose arguments consist (in any order) of one embellished operator and zero or more space-like elements. + \item an \xmltag{mo} element; + \item or one of the elements \xmltag{msub}, \xmltag{msup}, \xmltag{msubsup}, \xmltag{munder}, \xmltag{mover}, \xmltag{munderover}, \xmltag{mmultiscripts}, \xmltag{mfrac}, or \xmltag{semantics} (ยง 5.1 Annotation Framework), whose first argument exists and is an embellished operator; + \item or one of the elements \xmltag{mstyle}, \xmltag{mphantom}, or \xmltag{mpadded}, such that an mrow containing the same arguments would be an embellished operator; + \item or an \xmltag{maction} element whose selected sub-expression exists and is an embellished operator; + \item or an \xmltag{mrow} whose arguments consist (in any order) of one embellished operator and zero or more space-like elements. \end{itemize} \end{blockquote} -For every embellished operator, MathML calls the \tag{mo} element defining the embellished operator the \enquote{core} of the embellished operator. +For every embellished operator, MathML calls the \xmltag{mo} element defining the embellished operator the \enquote{core} of the embellished operator. \Luamml\ makes this slightly more general: Every expression is represented by a pair of two elements: The expression and it's core. -The core is always a \tag{mo}, \tag{mi}, or \tag{mn}, \texttt{nil} or s special marker for space like elements. +The core is always a \xmltag{mo}, \xmltag{mi}, or \xmltag{mn}, \texttt{nil} or s special marker for space like elements. -If and only if the element is a embellished operator the core is a \tag{mo} element representing the core of the embellished operator. -The core is a \tag{mi} or a \tag{mn} element if and only if the element would be an embellished operator with this core if this element where a \tag{mo} element. +If and only if the element is a embellished operator the core is a \xmltag{mo} element representing the core of the embellished operator. +The core is a \xmltag{mi} or a \xmltag{mn} element if and only if the element would be an embellished operator with this core if this element where a \xmltag{mo} element. The core is the special space like marker for space like elements. Otherwise the core is \texttt{nil}. -\section{Translation of math noads} +\subsection{Translation of math noads} A math lists can contain the following node types: noad, fence, fraction, radical, accent, style, choice, ins, mark, adjust, boundary, whatsit, penalty, disc, glue, and kern. The \enquote{noads} -\subsection{Translation of kernel noads} +\subsubsection{Translation of kernel noads} The math noads of this list contain nested kernel noads. So in the first step, we look into how kernel nodes are translated to math nodes. -\subsubsection{\texttt{math_char} kernel noads} +\paragraph{\texttt{math_char} kernel noads} First the family and character value in the \texttt{math_char} are used to lookup the Unicode character value of this \texttt{math_char}. -(For \textt{unicode-math}, this is usually just the character value. Legacy maths has to be remapped based on the family.) -Then there are two cases: The digits \texttt{0} to \texttt{9} are mapped to \tag{mn} elements, everything else becomes a \tag{mi} element with \texttt{mathvariant} set to \texttt{normal}. +(For \texttt{unicode-math}, this is usually just the character value. Legacy maths has to be remapped based on the family.) +Then there are two cases: The digits \texttt{0} to \texttt{9} are mapped to \xmltag{mn} elements, everything else becomes a \xmltag{mi} element with \texttt{mathvariant} set to \texttt{normal}. (The \texttt{mathvariant} value might get suppressed if the character defaults to mathvariant \texttt{normal}.) In either case, the \texttt{tex:family} attribute is set to the family number if it's not \texttt{0}. @@ -73,13 +70,13 @@ The core is always set to the expression itself. E.g.\ the \texttt{math_char} ke } \end{verbatim} -\subsection{\texttt{sub_box} kernel noads} +\subsubsection{\texttt{sub_box} kernel noads} I am open to suggestions how to convert them properly. -\subsection{\texttt{sub_mlist} kernel noads} -The inner list is converted as a \tag{mrow} element, with the core being the core of the \tag{mrow} element. See the rules for this later. +\subsubsection{\texttt{sub_mlist} kernel noads} +The inner list is converted as a \xmltag{mrow} element, with the core being the core of the \xmltag{mrow} element. See the rules for this later. -\subsection{\texttt{delim} kernel noads} +\subsubsection{\texttt{delim} kernel noads} If the \texttt{small_char} is zero, these get converted as space like elements of the form \begin{verbatim} {[0] = 'mspace', @@ -89,15 +86,13 @@ If the \texttt{small_char} is zero, these get converted as space like elements o where 1.196 is replaced by the current value of \verb+\nulldelimiterspace+ converted to \texttt{bp}. Otherwise the same rules as for \texttt{math_char} apply, -except that instead of \texttt{mi} or \tag{mn} elements, +except that instead of \texttt{mi} or \xmltag{mn} elements, \texttt{mo} elements are generated, \texttt{mathvariant} is never set, \texttt{stretchy} is set to \texttt{true} if the operator is not on the list of default stretchy operators in the MathML specification nd \texttt{lspace} and \texttt{rspace} attributes are set to zero. -\subsection{\texttt{acc} kernel noads} +\subsubsection{\texttt{acc} kernel noads} Depending on the surrounding element containing the \texttt{acc} kernel noad, it is either stretchy or not. If it's stretchy, the same rules as for \texttt{delim} apply, except that \texttt{lspace} and \texttt{rspace} are not set. -Otherwise the \textt{stretchy} attribute is set to false if the operator is on the list of default stretchy operators. - -\end{document} +Otherwise the \texttt{stretchy} attribute is set to false if the operator is on the list of default stretchy operators. diff --git a/testfiles-lua/cases.mlr b/testfiles-lua/cases.mlr index 286d847..ab7b075 100644 --- a/testfiles-lua/cases.mlr +++ b/testfiles-lua/cases.mlr @@ -1,10 +1,10 @@ - - ๐‘Ž - = - ๐‘ + + ๐‘Ž + = + ๐‘ - - + + ( @@ -47,9 +47,9 @@ ) - = - - { + = + + { @@ -58,10 +58,10 @@ if  - - ๐‘Ž - = - ๐‘ + + ๐‘Ž + = + ๐‘ @@ -78,76 +78,68 @@ - - ๐‘ฅ - = + + ๐‘ฅ + = - โˆ’ - ๐‘ - ยฑ + โˆ’ + ๐‘ + ยฑ - ๐‘ + ๐‘ 2 - โˆ’ + โˆ’ 4 - ๐‘Ž - ๐‘ + ๐‘Ž + ๐‘ 2 - ๐‘Ž + ๐‘Ž - . + . - - ๐‘ + + ๐‘ - + - โˆ‘ - ๐‘Ž + โˆ‘ + ๐‘Ž - ๐‘ + ๐‘ _ - ๐‘ + ๐‘ _ - ๐‘ - โ€ฒ + ๐‘ + โ€ฒ - - - s - i - n - - ( - ๐‘ฅ - ) - โˆ’ - - s - i - n - - ( - ๐‘ฅ - + + + sin + ( + ๐‘ฅ + ) + โˆ’ + sin + ( + ๐‘ฅ + + 2 - ๐œ‹ - ) - = + ๐œ‹ + ) + = 0 diff --git a/testfiles-lua/test_struct.tpf b/testfiles-lua/test_struct.tpf index 71fe9cf..6cb2135 100644 --- a/testfiles-lua/test_struct.tpf +++ b/testfiles-lua/test_struct.tpf @@ -1,111 +1,108 @@ %PDF-2.0 %ฬีมิลุะฤฦ -50 0 obj -<< /O/NSO/NS 12 0 R/displaystyle(true)/scriptlevel(0) >> +49 0 obj +<< /O/NSO/NS 0 0 R/displaystyle(true)/scriptlevel(0) >> endobj -53 0 obj -<< /O/NSO/NS 12 0 R/lspace(0.278em)/rspace(0.278em) >> +52 0 obj +<< /O/NSO/NS 0 0 R/lspace(0.278em)/rspace(0.278em) >> endobj -72 0 obj -<< /O/NSO/NS 12 0 R/intent(@ignore) >> +80 0 obj +<< /O/NSO/NS 0 0 R/display(block) >> endobj -82 0 obj -<< /O/NSO/NS 12 0 R/display(block) >> +83 0 obj +<< /O/NSO/NS 0 0 R/fence(true)/lspace(0)/rspace(0)/symmetric(true) >> endobj 85 0 obj -<< /O/NSO/NS 12 0 R/fence(true)/lspace(0)/rspace(0)/symmetric(true) >> +<< /O/NSO/NS 0 0 R/width(-4.981pt) >> endobj 87 0 obj -<< /O/NSO/NS 12 0 R/width(-4.981pt) >> +<< /O/NSO/NS 0 0 R/lspace(+4.981pt)/width(+9.963pt) >> endobj -89 0 obj -<< /O/NSO/NS 12 0 R/lspace(+4.981pt)/width(+9.963pt) >> +102 0 obj +<< /O/NSO/NS 0 0 R/width(1.196pt) >> +endobj +103 0 obj +<> +stream +(100010001)={1ifย ๐‘Ž=๐‘2else +endstream +endobj +24 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> +endobj +112 0 obj +<< /O/NSO/NS 0 0 R/lspace(0)/rspace(0.222em) >> +endobj +115 0 obj +<< /O/NSO/NS 0 0 R/lspace(0.222em)/rspace(0.222em) >> +endobj +129 0 obj +<< /O/NSO/NS 0 0 R/lspace(0)/rspace(0) >> +endobj +130 0 obj +<> +stream +๐‘ฅ=โˆ’๐‘ยฑ๐‘2โˆ’4๐‘Ž๐‘2๐‘Ž. +endstream endobj 104 0 obj -<< /O/NSO/NS 12 0 R/width(1.196pt) >> +<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> endobj -105 0 obj +136 0 obj +<< /O/NSO/NS 0 0 R/lspace(0)/movablelimits(true)/rspace(0.167em) >> +endobj +144 0 obj +<< /O/NSO/NS 0 0 R/stretchy(true) >> +endobj +148 0 obj +<< /O/NSO/NS 0 0 R/mathvariant(normal) >> +endobj +149 0 obj <> + /Length 316 >> stream -(100010001)={1ifย ๐‘Ž=๐‘2else +โˆ‘๐‘Ž๐‘_๐‘.๐‘โ€ฒ endstream endobj -25 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> -endobj -114 0 obj -<< /O/NSO/NS 12 0 R/lspace(0)/rspace(0.222em) >> -endobj -117 0 obj -<< /O/NSO/NS 12 0 R/lspace(0.222em)/rspace(0.222em) >> -endobj 131 0 obj -<< /O/NSO/NS 12 0 R/lspace(0)/rspace(0) >> +<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> endobj -132 0 obj +171 0 obj +<< /O/NSO/NS 0 0 R/lspace(0.278em)/rspace(0) >> +endobj +176 0 obj +<< /O/NSO/NS 0 0 R/fence(true)/lspace(0)/maxsize(17.861pt)/minsize(17.861pt)/rspace(0)/symmetric(true) >> +endobj +199 0 obj +<< /O/NSO/NS 0 0 R/columnalign(right left right left)/columnspacing(0 .8em 0)/displaystyle(true) >> +endobj +209 0 obj <> + /Length 1125 >> stream -๐‘ฅ=โˆ’๐‘ยฑ๐‘2โˆ’4๐‘Ž๐‘2๐‘Ž. +(1)๐‘Ž๐‘๐‘=๐‘‘๐‘’๐‘“๐‘’i๐œ‹=โˆ’1(2)(1+2=3)(3)5 endstream endobj -106 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> -endobj -138 0 obj -<< /O/NSO/NS 12 0 R/lspace(0)/movablelimits(true)/rspace(0.167em) >> -endobj -146 0 obj -<< /O/NSO/NS 12 0 R/stretchy(true) >> -endobj 150 0 obj -<< /O/NSO/NS 12 0 R/mathvariant(normal) >> +<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> endobj -151 0 obj +215 0 obj +<< /O/NSO/NS 0 0 R/lspace(0)/rspace(0)/stretchy(false) >> +endobj +228 0 obj <> + /Length 511 >> stream -โˆ‘๐‘Ž๐‘_๐‘.๐‘โ€ฒ +sin(๐‘ฅ)โˆ’sin(๐‘ฅ+2๐œ‹)=0 endstream endobj -133 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> +210 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> endobj -173 0 obj -<< /O/NSO/NS 12 0 R/lspace(0.278em)/rspace(0) >> -endobj -178 0 obj -<< /O/NSO/NS 12 0 R/fence(true)/lspace(0)/maxsize(17.861pt)/minsize(17.861pt)/rspace(0)/symmetric(true) >> -endobj -201 0 obj -<< /O/NSO/NS 12 0 R/columnalign(right left right left)/columnspacing(0 .8em 0)/displaystyle(true) >> -endobj -211 0 obj -<> -stream -(1)๐‘Ž๐‘๐‘=๐‘‘๐‘’๐‘“๐‘’i๐œ‹=โˆ’1(2)(1+2=3)(3)5 -endstream -endobj -152 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> -endobj -220 0 obj -<< /O/NSO/NS 12 0 R/lspace(0)/rspace(0)/stretchy(false) >> -endobj -236 0 obj -<> -stream -sin(๐‘ฅ)โˆ’sin(๐‘ฅ+2๐œ‹)=0 -endstream -endobj -212 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F /UF /EF<> >> -endobj -237 0 obj -<< /Type /Metadata /Subtype /XML /Length 10342 >> +229 0 obj +<< /Type /Metadata /Subtype /XML /Length 11362 >> stream @@ -132,6 +129,21 @@ stream xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field#"> + + XMP Media Management Schema + xmpMM + http://ns.adobe.com/xap/1.0/mm/ + + + + OriginalDocumentID + URI + internal + The common identifier for all versions and renditions of a document. + + + + PDF/A Identification Schema pdfaid @@ -159,6 +171,12 @@ stream internal Part of ISO 14289 standard + + rev + Integer + internal + Revision of ISO 14289 standard + @@ -193,13 +211,13 @@ stream publicationName Text external - Publicationname + Publication name aggregationType Text external - Publicationtype + Publication type bookEdition @@ -241,7 +259,7 @@ stream isbn Text external - ISBNforthepublicationinwhichthedocumentwaspublished + ISBN for the publication in which the document was published doi @@ -271,36 +289,36 @@ stream subtitle Text external - Document'ssubtitle + Document's subtitle - luahbtex-1.15.0 + luahbtex-NN.NN.NN 2.0 - Text + Text - en-US + en - 2001-01-01T20:59:59-00:00 + 2016-05-20T09:00:00Z application/pdf test_struct.tex LaTeX - 2001-01-01T20:59:59-00:00 - 2001-01-01T20:59:59-00:00 - 2001-01-01T20:59:59-00:00 + 2016-05-20T09:00:00Z + 2016-05-20T09:00:00Z + 2016-05-20T09:00:00Z uuid:0629f6ef-2113-4b62-83f8-5725311a8337 uuid:0a57c455-157a-4141-8c19-6237d832fc80 three @@ -311,8 +329,8 @@ stream endstream endobj -240 0 obj -<< /Length 8175 >> +232 0 obj +<< /Length 7848 >> stream /opacity1 gs /Artifact BMC @@ -326,9 +344,9 @@ EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 244.284 627.612 Tm [<09C9>]TJ -1 0 0 1 244.284 623.87 Tm [<09C8>]TJ -1 0 0 1 244.284 610.196 Tm [<09C7>]TJ +1 0 0 1 244.283 627.612 Tm [<09C9>]TJ +1 0 0 1 244.283 623.87 Tm [<09C8>]TJ +1 0 0 1 244.283 610.196 Tm [<09C7>]TJ ET EMC /Artifact BMC @@ -408,9 +426,9 @@ EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 287.871 627.612 Tm [<09CC>]TJ -1 0 0 1 287.871 623.87 Tm [<09CB>]TJ -1 0 0 1 287.871 610.196 Tm [<09CA>]TJ +1 0 0 1 287.87 627.612 Tm [<09CC>]TJ +1 0 0 1 287.87 623.87 Tm [<09CB>]TJ +1 0 0 1 287.87 610.196 Tm [<09CA>]TJ ET EMC /mo<> BDC @@ -450,13 +468,13 @@ EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 350.976 630.655 Tm [<001E>]TJ +1 0 0 1 350.977 630.655 Tm [<001E>]TJ ET EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 361.494 630.655 Tm [<0511>]TJ +1 0 0 1 361.495 630.655 Tm [<0511>]TJ ET EMC /Artifact BMC @@ -480,13 +498,13 @@ EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 259.389 584.176 Tm [<0527>]TJ +1 0 0 1 259.389 584.175 Tm [<0527>]TJ ET EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 267.855 584.176 Tm [<001E>]TJ +1 0 0 1 267.855 584.175 Tm [<001E>]TJ ET EMC /mo<> BDC @@ -498,7 +516,7 @@ EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 287.32 590.92 Tm [<0511>]TJ +1 0 0 1 287.319 590.92 Tm [<0511>]TJ ET EMC /mo<> BDC @@ -510,11 +528,11 @@ EMC /Artifact BMC BT /F20 9.96264 Tf -1 0 0 1 303.911 599.651 Tm [<0C05>]TJ +1 0 0 1 303.912 599.651 Tm [<0C05>]TJ ET q 1 0 0 1 312.21 599.851 cm -[] 0 d 0 J 0.398 w 0 0 m 35.683 0 l S +[] 0 d 0 J 0.398 w 0 0 m 35.684 0 l S Q EMC /mi<> BDC @@ -532,91 +550,91 @@ EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 323.363 590.92 Tm [<0A37>]TJ +1 0 0 1 323.364 590.92 Tm [<0A37>]TJ ET EMC /mn<> BDC BT /F20 9.96264 Tf -1 0 0 1 333.328 590.92 Tm [<0015>]TJ +1 0 0 1 333.329 590.92 Tm [<0015>]TJ ET EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 338.309 590.92 Tm [<0510>]TJ +1 0 0 1 338.31 590.92 Tm [<0510>]TJ ET EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 343.579 590.92 Tm [<0512>]TJ +1 0 0 1 343.58 590.92 Tm [<0512>]TJ ET EMC /Artifact BMC q -1 0 0 1 279.569 586.667 cm +1 0 0 1 279.569 586.666 cm [] 0 d 0 J 0.398 w 0 0 m 68.325 0 l S Q EMC /mn<> BDC BT /F20 9.96264 Tf -1 0 0 1 308.605 577.343 Tm [<0013>]TJ +1 0 0 1 308.605 577.341 Tm [<0013>]TJ ET EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 313.587 577.343 Tm [<0510>]TJ +1 0 0 1 313.587 577.341 Tm [<0510>]TJ ET EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 349.089 584.176 Tm [<000F>]TJ +1 0 0 1 349.089 584.175 Tm [<000F>]TJ ET EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 289.258 554.288 Tm [<0C02>]TJ +1 0 0 1 289.257 554.287 Tm [<0C02>]TJ ET EMC /mi<> BDC BT /F21 6.97385 Tf -1 0 0 1 294.289 543.828 Tm [<057C>]TJ +1 0 0 1 294.289 543.827 Tm [<057C>]TJ ET EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 305.304 554.288 Tm [<0512>]TJ +1 0 0 1 305.304 554.287 Tm [<0512>]TJ ET EMC /Artifact BMC q -1 0 0 1 305.304 552.784 cm +1 0 0 1 305.304 552.783 cm [] 0 d 0 J 0.398 w 0 0 m 4.314 0 l S Q EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 313.902 556.719 Tm [<06FE>]TJ +1 0 0 1 313.902 556.718 Tm [<06FE>]TJ ET EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 309.618 554.288 Tm [<0511>]TJ +1 0 0 1 309.618 554.287 Tm [<0511>]TJ ET EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 314.031 554.288 Tm [<0512>]TJ +1 0 0 1 314.031 554.287 Tm [<0512>]TJ ET EMC /mi<> BDC @@ -630,19 +648,19 @@ EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 231.386 514.438 Tm [<0510>]TJ +1 0 0 1 231.386 514.437 Tm [<0510>]TJ ET EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 236.656 514.438 Tm [<0511>]TJ +1 0 0 1 236.656 514.437 Tm [<0511>]TJ ET EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 241.07 514.438 Tm [<0512>]TJ +1 0 0 1 241.07 514.437 Tm [<0512>]TJ ET EMC /Artifact BMC @@ -650,25 +668,25 @@ EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 248.151 514.438 Tm [<001E>]TJ +1 0 0 1 248.151 514.437 Tm [<001E>]TJ ET EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 258.669 514.438 Tm [<0513>]TJ +1 0 0 1 258.669 514.437 Tm [<0513>]TJ ET EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 264.088 514.438 Tm [<0514>]TJ +1 0 0 1 264.089 514.437 Tm [<0514>]TJ ET EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 268.731 514.438 Tm [<0515>]TJ +1 0 0 1 268.731 514.437 Tm [<0515>]TJ ET EMC /Artifact BMC @@ -676,19 +694,19 @@ EMC /mi<> BDC BT /F20 9.96264 Tf -1 0 0 1 356.482 514.438 Tm [<0514>]TJ +1 0 0 1 356.481 514.437 Tm [<0514>]TJ ET EMC /mi<> BDC BT /F32 6.97385 Tf -1 0 0 1 361.124 518.054 Tm [<0042>]TJ +1 0 0 1 361.124 518.053 Tm [<0042>]TJ ET EMC /mi<> BDC BT /F21 6.97385 Tf -1 0 0 1 363.377 518.054 Tm [<11CE>]TJ +1 0 0 1 363.377 518.053 Tm [<11CE>]TJ ET EMC /Artifact BMC @@ -696,49 +714,49 @@ EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 371.36 514.438 Tm [<001E>]TJ +1 0 0 1 371.36 514.437 Tm [<001E>]TJ ET EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 381.878 514.438 Tm [<0A37>]TJ +1 0 0 1 381.879 514.437 Tm [<0A37>]TJ ET EMC /mn<> BDC BT /F20 9.96264 Tf -1 0 0 1 389.629 514.438 Tm [<0012>]TJ +1 0 0 1 389.63 514.437 Tm [<0012>]TJ ET EMC /Artifact BMC BT /F15 9.96264 Tf -1 0 0 1 464.747 514.438 Tm [<005500520056>]TJ +1 0 0 1 464.747 514.437 Tm [<005500520056>]TJ ET EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 216.637 493.955 Tm [<0997>]TJ +1 0 0 1 216.637 493.954 Tm [<0997>]TJ ET EMC /mn<> BDC BT /F20 9.96264 Tf -1 0 0 1 223.243 493.955 Tm [<0012>]TJ +1 0 0 1 223.242 493.954 Tm [<0012>]TJ ET EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 230.438 493.955 Tm [<000C>]TJ +1 0 0 1 230.437 493.954 Tm [<000C>]TJ ET EMC /mn<> BDC BT /F20 9.96264 Tf -1 0 0 1 240.402 493.955 Tm [<0013>]TJ +1 0 0 1 240.402 493.954 Tm [<0013>]TJ ET EMC /Artifact BMC @@ -746,152 +764,128 @@ EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 248.151 493.955 Tm [<001E>]TJ +1 0 0 1 248.151 493.954 Tm [<001E>]TJ ET EMC /mn<> BDC BT /F20 9.96264 Tf -1 0 0 1 258.669 493.955 Tm [<0014>]TJ +1 0 0 1 258.669 493.954 Tm [<0014>]TJ ET EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 263.65 493.955 Tm [<0998>]TJ +1 0 0 1 263.65 493.954 Tm [<0998>]TJ ET EMC /Artifact BMC BT /F15 9.96264 Tf -1 0 0 1 464.747 493.955 Tm [<0055006B0056>]TJ +1 0 0 1 464.747 493.954 Tm [<0055006B0056>]TJ ET EMC /mn<> BDC BT /F20 9.96264 Tf -1 0 0 1 240.402 473.671 Tm [<0016>]TJ +1 0 0 1 240.402 473.67 Tm [<0016>]TJ ET EMC /Artifact BMC BT /F15 9.96264 Tf -1 0 0 1 464.747 473.671 Tm [<0055006A0056>]TJ -1 0 0 1 148.712 451.753 Tm [<003100620067003B0042004800690067>]TJ +1 0 0 1 464.747 473.67 Tm [<0055006A0056>]TJ +1 0 0 1 148.712 451.752 Tm [<003100620067003B0042004800690067>]TJ ET EMC /mi<> BDC BT /F15 9.96264 Tf -1 0 0 1 180.453 451.753 Tm [<0062>]TJ +1 0 0 1 180.453 451.752 Tm [<00620042004D>]TJ ET EMC -/mi<> BDC +/mo<> BDC BT -/F15 9.96264 Tf -1 0 0 1 184.379 451.753 Tm [<0042>]TJ +/F20 9.96264 Tf +1 0 0 1 192.687 451.752 Tm [<0009>]TJ ET EMC /mi<> BDC BT -/F15 9.96264 Tf -1 0 0 1 187.148 451.753 Tm [<004D>]TJ +/F20 9.96264 Tf +1 0 0 1 196.563 451.752 Tm [<0527>]TJ ET EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 192.687 451.753 Tm [<0009>]TJ +1 0 0 1 202.262 451.752 Tm [<000A>]TJ ET EMC -/mi<> BDC +/mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 196.563 451.753 Tm [<0527>]TJ +1 0 0 1 208.351 451.752 Tm [<0A37>]TJ ET EMC -/mo<> BDC +/mi<> BDC BT -/F20 9.96264 Tf -1 0 0 1 202.262 451.753 Tm [<000A>]TJ +/F15 9.96264 Tf +1 0 0 1 218.316 451.752 Tm [<00620042004D>]TJ ET EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 208.351 451.753 Tm [<0A37>]TJ +1 0 0 1 230.55 451.752 Tm [<0009>]TJ ET EMC /mi<> BDC BT -/F15 9.96264 Tf -1 0 0 1 218.315 451.753 Tm [<0062>]TJ +/F20 9.96264 Tf +1 0 0 1 234.425 451.752 Tm [<0527>]TJ ET EMC -/mi<> BDC -BT -/F15 9.96264 Tf -1 0 0 1 222.241 451.753 Tm [<0042>]TJ -ET -EMC -/mi<> BDC -BT -/F15 9.96264 Tf -1 0 0 1 225.01 451.753 Tm [<004D>]TJ -ET -EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 230.549 451.753 Tm [<0009>]TJ +1 0 0 1 242.338 451.752 Tm [<000C>]TJ ET EMC -/mi<> BDC +/mn<> BDC BT /F20 9.96264 Tf -1 0 0 1 234.425 451.753 Tm [<0527>]TJ +1 0 0 1 252.303 451.752 Tm [<0013>]TJ +ET +EMC +/mi<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 257.284 451.752 Tm [<117A>]TJ +ET +EMC +/mo<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 263.212 451.752 Tm [<000A>]TJ ET EMC /mo<> BDC BT /F20 9.96264 Tf -1 0 0 1 242.337 451.753 Tm [<000C>]TJ +1 0 0 1 269.854 451.752 Tm [<001E>]TJ ET EMC /mn<> BDC BT /F20 9.96264 Tf -1 0 0 1 252.302 451.753 Tm [<0013>]TJ -ET -EMC -/mi<> BDC -BT -/F20 9.96264 Tf -1 0 0 1 257.283 451.753 Tm [<117A>]TJ -ET -EMC -/mo<> BDC -BT -/F20 9.96264 Tf -1 0 0 1 263.211 451.753 Tm [<000A>]TJ -ET -EMC -/mo<> BDC -BT -/F20 9.96264 Tf -1 0 0 1 269.853 451.753 Tm [<001E>]TJ -ET -EMC -/mn<> BDC -BT -/F20 9.96264 Tf -1 0 0 1 280.371 451.753 Tm [<0011>]TJ +1 0 0 1 280.373 451.752 Tm [<0011>]TJ ET EMC /Artifact BMC BT /F15 9.96264 Tf -1 0 0 1 285.353 451.753 Tm [<0058>]TJ +1 0 0 1 285.354 451.752 Tm [<0058>]TJ ET EMC /Artifact BMC @@ -904,645 +898,624 @@ EMC EMC endstream endobj -239 0 obj -<< /Type /Page /Contents 240 0 R /Resources 238 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 245 0 R >> +231 0 obj +<< /Type /Page /Contents 232 0 R /Resources 230 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 237 0 R >> endobj -238 0 obj -<< /ExtGState 1 0 R /Font << /F15 241 0 R /F20 242 0 R /F21 243 0 R /F32 244 0 R >> >> +230 0 obj +<< /ExtGState 1 0 R /Font << /F15 233 0 R /F20 234 0 R /F21 235 0 R /F32 236 0 R >> >> endobj 1 0 obj << /opacity1 <> >> endobj -246 0 obj +238 0 obj << /Marked true >> endobj 6 0 obj -<< /Nums [0 [ 24 0 R 84 0 R 28 0 R 30 0 R 32 0 R 34 0 R 36 0 R 38 0 R 40 0 R 42 0 R 44 0 R 95 0 R 96 0 R 98 0 R 46 0 R 55 0 R 57 0 R 58 0 R 59 0 R 74 0 R 76 0 R 109 0 R 110 0 R 113 0 R 115 0 R 116 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 128 0 R 129 0 R 130 0 R 137 0 R 139 0 R 141 0 R 145 0 R 144 0 R 148 0 R 149 0 R 155 0 R 156 0 R 157 0 R 160 0 R 161 0 R 162 0 R 163 0 R 166 0 R 168 0 R 169 0 R 172 0 R 174 0 R 175 0 R 177 0 R 179 0 R 180 0 R 181 0 R 184 0 R 185 0 R 186 0 R 192 0 R 216 0 R 217 0 R 218 0 R 219 0 R 221 0 R 222 0 R 223 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R] +<< /Nums [0 [ 23 0 R 82 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 41 0 R 43 0 R 93 0 R 94 0 R 96 0 R 45 0 R 54 0 R 56 0 R 57 0 R 58 0 R 72 0 R 74 0 R 107 0 R 108 0 R 111 0 R 113 0 R 114 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 126 0 R 127 0 R 128 0 R 135 0 R 137 0 R 139 0 R 143 0 R 142 0 R 146 0 R 147 0 R 153 0 R 154 0 R 155 0 R 158 0 R 159 0 R 160 0 R 161 0 R 164 0 R 166 0 R 167 0 R 170 0 R 172 0 R 173 0 R 175 0 R 177 0 R 178 0 R 179 0 R 182 0 R 183 0 R 184 0 R 190 0 R 213 0 R 214 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R] ] >> endobj -247 0 obj -<< /Limits [(ID.0001) (ID.0050)]/Names [(ID.0001) 22 0 R (ID.0002) 23 0 R (ID.0003) 24 0 R (ID.0004) 26 0 R (ID.0005) 27 0 R (ID.0006) 28 0 R (ID.0007) 29 0 R (ID.0008) 30 0 R (ID.0009) 31 0 R (ID.0010) 32 0 R (ID.0011) 33 0 R (ID.0012) 34 0 R (ID.0013) 35 0 R (ID.0014) 36 0 R (ID.0015) 37 0 R (ID.0016) 38 0 R (ID.0017) 39 0 R (ID.0018) 40 0 R (ID.0019) 41 0 R (ID.0020) 42 0 R (ID.0021) 43 0 R (ID.0022) 44 0 R (ID.0023) 45 0 R (ID.0024) 46 0 R (ID.0025) 47 0 R (ID.0026) 48 0 R (ID.0027) 49 0 R (ID.0028) 51 0 R (ID.0029) 52 0 R (ID.0030) 54 0 R (ID.0031) 55 0 R (ID.0032) 56 0 R (ID.0033) 57 0 R (ID.0034) 58 0 R (ID.0035) 59 0 R (ID.0036) 60 0 R (ID.0037) 61 0 R (ID.0038) 62 0 R (ID.0039) 63 0 R (ID.0040) 64 0 R (ID.0041) 65 0 R (ID.0042) 66 0 R (ID.0043) 67 0 R (ID.0044) 68 0 R (ID.0045) 69 0 R (ID.0046) 70 0 R (ID.0047) 71 0 R (ID.0048) 73 0 R (ID.0049) 74 0 R (ID.0050) 75 0 R ] >> +239 0 obj +<< /Limits [(ID.0002) (ID.0051)]/Names [(ID.0002) 21 0 R (ID.0003) 22 0 R (ID.0004) 23 0 R (ID.0005) 25 0 R (ID.0006) 26 0 R (ID.0007) 27 0 R (ID.0008) 28 0 R (ID.0009) 29 0 R (ID.0010) 30 0 R (ID.0011) 31 0 R (ID.0012) 32 0 R (ID.0013) 33 0 R (ID.0014) 34 0 R (ID.0015) 35 0 R (ID.0016) 36 0 R (ID.0017) 37 0 R (ID.0018) 38 0 R (ID.0019) 39 0 R (ID.0020) 40 0 R (ID.0021) 41 0 R (ID.0022) 42 0 R (ID.0023) 43 0 R (ID.0024) 44 0 R (ID.0025) 45 0 R (ID.0026) 46 0 R (ID.0027) 47 0 R (ID.0028) 48 0 R (ID.0029) 50 0 R (ID.0030) 51 0 R (ID.0031) 53 0 R (ID.0032) 54 0 R (ID.0033) 55 0 R (ID.0034) 56 0 R (ID.0035) 57 0 R (ID.0036) 58 0 R (ID.0037) 59 0 R (ID.0038) 60 0 R (ID.0039) 61 0 R (ID.0040) 62 0 R (ID.0041) 63 0 R (ID.0042) 64 0 R (ID.0043) 65 0 R (ID.0044) 66 0 R (ID.0045) 67 0 R (ID.0046) 68 0 R (ID.0047) 69 0 R (ID.0048) 70 0 R (ID.0049) 71 0 R (ID.0050) 72 0 R (ID.0051) 73 0 R ] >> endobj -248 0 obj -<< /Limits [(ID.0051) (ID.0100)]/Names [(ID.0051) 76 0 R (ID.0052) 77 0 R (ID.0053) 78 0 R (ID.0054) 79 0 R (ID.0055) 80 0 R (ID.0056) 81 0 R (ID.0057) 83 0 R (ID.0058) 84 0 R (ID.0059) 86 0 R (ID.0060) 88 0 R (ID.0061) 90 0 R (ID.0062) 91 0 R (ID.0063) 92 0 R (ID.0064) 93 0 R (ID.0065) 94 0 R (ID.0066) 95 0 R (ID.0067) 96 0 R (ID.0068) 97 0 R (ID.0069) 98 0 R (ID.0070) 99 0 R (ID.0071) 100 0 R (ID.0072) 101 0 R (ID.0073) 102 0 R (ID.0074) 103 0 R (ID.0075) 107 0 R (ID.0076) 108 0 R (ID.0077) 109 0 R (ID.0078) 110 0 R (ID.0079) 111 0 R (ID.0080) 112 0 R (ID.0081) 113 0 R (ID.0082) 115 0 R (ID.0083) 116 0 R (ID.0084) 118 0 R (ID.0085) 119 0 R (ID.0086) 120 0 R (ID.0087) 121 0 R (ID.0088) 122 0 R (ID.0089) 123 0 R (ID.0090) 124 0 R (ID.0091) 125 0 R (ID.0092) 126 0 R (ID.0093) 127 0 R (ID.0094) 128 0 R (ID.0095) 129 0 R (ID.0096) 130 0 R (ID.0097) 134 0 R (ID.0098) 135 0 R (ID.0099) 136 0 R (ID.0100) 137 0 R ] >> +240 0 obj +<< /Limits [(ID.0052) (ID.0101)]/Names [(ID.0052) 74 0 R (ID.0053) 75 0 R (ID.0054) 76 0 R (ID.0055) 77 0 R (ID.0056) 78 0 R (ID.0057) 79 0 R (ID.0058) 81 0 R (ID.0059) 82 0 R (ID.0060) 84 0 R (ID.0061) 86 0 R (ID.0062) 88 0 R (ID.0063) 89 0 R (ID.0064) 90 0 R (ID.0065) 91 0 R (ID.0066) 92 0 R (ID.0067) 93 0 R (ID.0068) 94 0 R (ID.0069) 95 0 R (ID.0070) 96 0 R (ID.0071) 97 0 R (ID.0072) 98 0 R (ID.0073) 99 0 R (ID.0074) 100 0 R (ID.0075) 101 0 R (ID.0076) 105 0 R (ID.0077) 106 0 R (ID.0078) 107 0 R (ID.0079) 108 0 R (ID.0080) 109 0 R (ID.0081) 110 0 R (ID.0082) 111 0 R (ID.0083) 113 0 R (ID.0084) 114 0 R (ID.0085) 116 0 R (ID.0086) 117 0 R (ID.0087) 118 0 R (ID.0088) 119 0 R (ID.0089) 120 0 R (ID.0090) 121 0 R (ID.0091) 122 0 R (ID.0092) 123 0 R (ID.0093) 124 0 R (ID.0094) 125 0 R (ID.0095) 126 0 R (ID.0096) 127 0 R (ID.0097) 128 0 R (ID.0098) 132 0 R (ID.0099) 133 0 R (ID.0100) 134 0 R (ID.0101) 135 0 R ] >> endobj -249 0 obj -<< /Limits [(ID.0101) (ID.0150)]/Names [(ID.0101) 139 0 R (ID.0102) 140 0 R (ID.0103) 141 0 R (ID.0104) 142 0 R (ID.0105) 143 0 R (ID.0106) 144 0 R (ID.0107) 145 0 R (ID.0108) 147 0 R (ID.0109) 148 0 R (ID.0110) 149 0 R (ID.0111) 153 0 R (ID.0112) 154 0 R (ID.0113) 155 0 R (ID.0114) 156 0 R (ID.0115) 157 0 R (ID.0116) 158 0 R (ID.0117) 159 0 R (ID.0118) 160 0 R (ID.0119) 161 0 R (ID.0120) 162 0 R (ID.0121) 163 0 R (ID.0122) 164 0 R (ID.0123) 165 0 R (ID.0124) 166 0 R (ID.0125) 167 0 R (ID.0126) 168 0 R (ID.0127) 169 0 R (ID.0128) 170 0 R (ID.0129) 171 0 R (ID.0130) 172 0 R (ID.0131) 174 0 R (ID.0132) 175 0 R (ID.0133) 176 0 R (ID.0134) 177 0 R (ID.0135) 179 0 R (ID.0136) 180 0 R (ID.0137) 181 0 R (ID.0138) 182 0 R (ID.0139) 183 0 R (ID.0140) 184 0 R (ID.0141) 185 0 R (ID.0142) 186 0 R (ID.0143) 187 0 R (ID.0144) 188 0 R (ID.0145) 189 0 R (ID.0146) 190 0 R (ID.0147) 191 0 R (ID.0148) 192 0 R (ID.0149) 193 0 R (ID.0150) 194 0 R ] >> +241 0 obj +<< /Limits [(ID.0102) (ID.0151)]/Names [(ID.0102) 137 0 R (ID.0103) 138 0 R (ID.0104) 139 0 R (ID.0105) 140 0 R (ID.0106) 141 0 R (ID.0107) 142 0 R (ID.0108) 143 0 R (ID.0109) 145 0 R (ID.0110) 146 0 R (ID.0111) 147 0 R (ID.0112) 151 0 R (ID.0113) 152 0 R (ID.0114) 153 0 R (ID.0115) 154 0 R (ID.0116) 155 0 R (ID.0117) 156 0 R (ID.0118) 157 0 R (ID.0119) 158 0 R (ID.0120) 159 0 R (ID.0121) 160 0 R (ID.0122) 161 0 R (ID.0123) 162 0 R (ID.0124) 163 0 R (ID.0125) 164 0 R (ID.0126) 165 0 R (ID.0127) 166 0 R (ID.0128) 167 0 R (ID.0129) 168 0 R (ID.0130) 169 0 R (ID.0131) 170 0 R (ID.0132) 172 0 R (ID.0133) 173 0 R (ID.0134) 174 0 R (ID.0135) 175 0 R (ID.0136) 177 0 R (ID.0137) 178 0 R (ID.0138) 179 0 R (ID.0139) 180 0 R (ID.0140) 181 0 R (ID.0141) 182 0 R (ID.0142) 183 0 R (ID.0143) 184 0 R (ID.0144) 185 0 R (ID.0145) 186 0 R (ID.0146) 187 0 R (ID.0147) 188 0 R (ID.0148) 189 0 R (ID.0149) 190 0 R (ID.0150) 191 0 R (ID.0151) 192 0 R ] >> endobj -250 0 obj -<< /Limits [(ID.0151) (ID.0187)]/Names [(ID.0151) 195 0 R (ID.0152) 196 0 R (ID.0153) 197 0 R (ID.0154) 198 0 R (ID.0155) 199 0 R (ID.0156) 200 0 R (ID.0157) 202 0 R (ID.0158) 203 0 R (ID.0159) 204 0 R (ID.0160) 205 0 R (ID.0161) 206 0 R (ID.0162) 207 0 R (ID.0163) 208 0 R (ID.0164) 209 0 R (ID.0165) 210 0 R (ID.0166) 213 0 R (ID.0167) 214 0 R (ID.0168) 215 0 R (ID.0169) 216 0 R (ID.0170) 217 0 R (ID.0171) 218 0 R (ID.0172) 219 0 R (ID.0173) 221 0 R (ID.0174) 222 0 R (ID.0175) 223 0 R (ID.0176) 224 0 R (ID.0177) 225 0 R (ID.0178) 226 0 R (ID.0179) 227 0 R (ID.0180) 228 0 R (ID.0181) 229 0 R (ID.0182) 230 0 R (ID.0183) 231 0 R (ID.0184) 232 0 R (ID.0185) 233 0 R (ID.0186) 234 0 R (ID.0187) 235 0 R ] >> +242 0 obj +<< /Limits [(ID.0152) (ID.0182)]/Names [(ID.0152) 193 0 R (ID.0153) 194 0 R (ID.0154) 195 0 R (ID.0155) 196 0 R (ID.0156) 197 0 R (ID.0157) 198 0 R (ID.0158) 200 0 R (ID.0159) 201 0 R (ID.0160) 202 0 R (ID.0161) 203 0 R (ID.0162) 204 0 R (ID.0163) 205 0 R (ID.0164) 206 0 R (ID.0165) 207 0 R (ID.0166) 208 0 R (ID.0167) 211 0 R (ID.0168) 212 0 R (ID.0169) 213 0 R (ID.0170) 214 0 R (ID.0171) 216 0 R (ID.0172) 217 0 R (ID.0173) 218 0 R (ID.0174) 219 0 R (ID.0175) 220 0 R (ID.0176) 221 0 R (ID.0177) 222 0 R (ID.0178) 223 0 R (ID.0179) 224 0 R (ID.0180) 225 0 R (ID.0181) 226 0 R (ID.0182) 227 0 R ] >> endobj -251 0 obj -<< /Kids [247 0 R 248 0 R 249 0 R 250 0 R] >> -endobj -8 0 obj -<< /Type /Namespace /NS (http://iso.org/pdf/ssn) >> -endobj -10 0 obj -<< /Type /Namespace /NS (http://iso.org/pdf2/ssn) >> -endobj -12 0 obj -<< /Type /Namespace /NS (http://www.w3.org/1998/Math/MathML) >> -endobj -15 0 obj -<< /title [/Title 10 0 R] /part [/Title 10 0 R] /section [/H1 10 0 R] /subsection [/H2 10 0 R] /subsubsection [/H3 10 0 R] /paragraph [/H4 10 0 R] /subparagraph [/H5 10 0 R] /itemize [/L 10 0 R] /enumerate [/L 10 0 R] /description [/L 10 0 R] /item [/LI 10 0 R] /itemlabel [/Lbl 10 0 R] /itembody [/LBody 10 0 R] /footnote [/FENote 10 0 R] /footnotemark [/Lbl 10 0 R] /footnotelabel [/Lbl 10 0 R] >> -endobj -14 0 obj -<< /Type /Namespace /NS (https://www.latex-project.org/ns/dflt/2022) /RoleMapNS 15 0 R >> -endobj -17 0 obj -<< /chapter [/H1 10 0 R] /section [/H2 10 0 R] /subsection [/H3 10 0 R] /subsubsection [/H4 10 0 R] /paragraph [/H5 10 0 R] /subparagraph [/H6 10 0 R] >> -endobj -16 0 obj -<< /Type /Namespace /NS (https://www.latex-project.org/ns/book/2022) /RoleMapNS 17 0 R >> -endobj -19 0 obj -<< /chapter [/Span 10 0 R] /section [/Span 10 0 R] /subsection [/Span 10 0 R] /subsubsection [/Span 10 0 R] /paragraph [/Span 10 0 R] /subparagraph [/Span 10 0 R] /P [/Span 10 0 R] >> -endobj -18 0 obj -<< /Type /Namespace /NS (https://www.latex-project.org/ns/inline/2022) /RoleMapNS 19 0 R >> -endobj -20 0 obj -<< /Type /Namespace /NS (data:,A63761E-9D7-4FBB-9B27-C3BC8D9BFB06) >> +243 0 obj +<< /Kids [239 0 R 240 0 R 241 0 R 242 0 R] >> endobj 7 0 obj -[ 8 0 R 10 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R ] +<< /Artifact /NonStruct /DocumentFragment /Art /Aside /Note /H7 /H6 /H8 /H6 /H9 /H6 /H10 /H6 /Title /P /FENote /Note /Sub /Span /Em /Span /Strong /Span /title /P /part /P /section /H1 /subsection /H2 /subsubsection /H3 /paragraph /H4 /subparagraph /H5 /list /L /itemize /L /enumerate /L /description /L /quote /BlockQuote /quotation /BlockQuote /verbatim /P /item /LI /itemlabel /Lbl /itembody /LBody /footnote /Note /footnotemark /Lbl /footnotelabel /Lbl /text-unit /Part /text /P /theorem-like /Sect /codeline /Span /float /Note /figures /Sect /tables /Sect >> +endobj +9 0 obj +<< /Type /Namespace /NS (http://iso.org/pdf/ssn) >> +endobj +11 0 obj +<< /Type /Namespace /NS (http://iso.org/pdf2/ssn) >> +endobj +13 0 obj +<< /Type /Namespace /NS (http://www.w3.org/1998/Math/MathML) >> +endobj +16 0 obj +<< /title [/Title 11 0 R] /part [/Title 11 0 R] /section [/H1 11 0 R] /subsection [/H2 11 0 R] /subsubsection [/H3 11 0 R] /paragraph [/H4 11 0 R] /subparagraph [/H5 11 0 R] /list [/L 11 0 R] /itemize [/L 11 0 R] /enumerate [/L 11 0 R] /description [/L 11 0 R] /quote [/BlockQuote 9 0 R] /quotation [/BlockQuote 9 0 R] /verbatim [/P 11 0 R] /item [/LI 11 0 R] /itemlabel [/Lbl 11 0 R] /itembody [/LBody 11 0 R] /footnote [/FENote 11 0 R] /footnotemark [/Lbl 11 0 R] /footnotelabel [/Lbl 11 0 R] /text-unit [/Part 11 0 R] /text [/P 11 0 R] /theorem-like [/Sect 11 0 R] /codeline [/Sub 11 0 R] /float [/Aside 11 0 R] /figures [/Sect 11 0 R] /tables [/Sect 11 0 R] >> +endobj +15 0 obj +<< /Type /Namespace /NS (https://www.latex-project.org/ns/dflt/2022) /RoleMapNS 16 0 R >> +endobj +18 0 obj +<< /chapter [/H1 11 0 R] /section [/H2 11 0 R] /subsection [/H3 11 0 R] /subsubsection [/H4 11 0 R] /paragraph [/H5 11 0 R] /subparagraph [/H6 11 0 R] >> +endobj +17 0 obj +<< /Type /Namespace /NS (https://www.latex-project.org/ns/book/2022) /RoleMapNS 18 0 R >> +endobj +19 0 obj +<< /Type /Namespace /NS (data:,A63761E-9D7-4FBB-9B27-C3BC8D9BFB06) >> +endobj +8 0 obj +[ 9 0 R 11 0 R 13 0 R 15 0 R 17 0 R 19 0 R ] +endobj +21 0 obj +<< /Type /StructElem /S /Document /NS 11 0 R /P 5 0 R /K 22 0 R /ID (ID.0002) >> endobj 22 0 obj -<< /Type /StructElem /S /Document /P 5 0 R /K 23 0 R /NS 10 0 R /ID (ID.0001) >> +<< /Type /StructElem /S /Document /NS 11 0 R /P 21 0 R /K [23 0 R 25 0 R 105 0 R 132 0 R 151 0 R 211 0 R] /ID (ID.0003) >> endobj 23 0 obj -<< /Type /StructElem /S /Document /P 22 0 R /K [24 0 R 26 0 R 107 0 R 134 0 R 153 0 R 213 0 R] /NS 10 0 R /ID (ID.0002) >> +<< /Type /StructElem /S /P /NS 11 0 R /P 22 0 R /K <> /ID (ID.0004) >> endobj -24 0 obj -<< /Type /StructElem /S /P /P 23 0 R /K <> /NS 10 0 R /ID (ID.0003) >> +25 0 obj +<< /Type /StructElem /AF [24 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 79 0 R /ID (ID.0005) >> endobj 26 0 obj -<< /Type /StructElem /S /Formula /P 23 0 R /K 81 0 R /AF [25 0 R] /NS 10 0 R /ID (ID.0004) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 89 0 R /K 27 0 R /ID (ID.0006) >> endobj 27 0 obj -<< /Type /StructElem /S /mtd /P 91 0 R /K 28 0 R /NS 12 0 R /ID (ID.0005) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 26 0 R /K <> /ID (ID.0007) >> endobj 28 0 obj -<< /Type /StructElem /S /mn /P 27 0 R /K <> /NS 12 0 R /ID (ID.0006) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 89 0 R /K 29 0 R /ID (ID.0008) >> endobj 29 0 obj -<< /Type /StructElem /S /mtd /P 91 0 R /K 30 0 R /NS 12 0 R /ID (ID.0007) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 28 0 R /K <> /ID (ID.0009) >> endobj 30 0 obj -<< /Type /StructElem /S /mn /P 29 0 R /K <> /NS 12 0 R /ID (ID.0008) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 89 0 R /K 31 0 R /ID (ID.0010) >> endobj 31 0 obj -<< /Type /StructElem /S /mtd /P 91 0 R /K 32 0 R /NS 12 0 R /ID (ID.0009) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 30 0 R /K <> /ID (ID.0011) >> endobj 32 0 obj -<< /Type /StructElem /S /mn /P 31 0 R /K <> /NS 12 0 R /ID (ID.0010) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 90 0 R /K 33 0 R /ID (ID.0012) >> endobj 33 0 obj -<< /Type /StructElem /S /mtd /P 92 0 R /K 34 0 R /NS 12 0 R /ID (ID.0011) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 32 0 R /K <> /ID (ID.0013) >> endobj 34 0 obj -<< /Type /StructElem /S /mn /P 33 0 R /K <> /NS 12 0 R /ID (ID.0012) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 90 0 R /K 35 0 R /ID (ID.0014) >> endobj 35 0 obj -<< /Type /StructElem /S /mtd /P 92 0 R /K 36 0 R /NS 12 0 R /ID (ID.0013) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 34 0 R /K <> /ID (ID.0015) >> endobj 36 0 obj -<< /Type /StructElem /S /mn /P 35 0 R /K <> /NS 12 0 R /ID (ID.0014) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 90 0 R /K 37 0 R /ID (ID.0016) >> endobj 37 0 obj -<< /Type /StructElem /S /mtd /P 92 0 R /K 38 0 R /NS 12 0 R /ID (ID.0015) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 36 0 R /K <> /ID (ID.0017) >> endobj 38 0 obj -<< /Type /StructElem /S /mn /P 37 0 R /K <> /NS 12 0 R /ID (ID.0016) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 39 0 R /ID (ID.0018) >> endobj 39 0 obj -<< /Type /StructElem /S /mtd /P 93 0 R /K 40 0 R /NS 12 0 R /ID (ID.0017) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 38 0 R /K <> /ID (ID.0019) >> endobj 40 0 obj -<< /Type /StructElem /S /mn /P 39 0 R /K <> /NS 12 0 R /ID (ID.0018) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 41 0 R /ID (ID.0020) >> endobj 41 0 obj -<< /Type /StructElem /S /mtd /P 93 0 R /K 42 0 R /NS 12 0 R /ID (ID.0019) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 40 0 R /K <> /ID (ID.0021) >> endobj 42 0 obj -<< /Type /StructElem /S /mn /P 41 0 R /K <> /NS 12 0 R /ID (ID.0020) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 43 0 R /ID (ID.0022) >> endobj 43 0 obj -<< /Type /StructElem /S /mtd /P 93 0 R /K 44 0 R /NS 12 0 R /ID (ID.0021) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 42 0 R /K <> /ID (ID.0023) >> endobj 44 0 obj -<< /Type /StructElem /S /mn /P 43 0 R /K <> /NS 12 0 R /ID (ID.0022) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 99 0 R /K 45 0 R /ID (ID.0024) >> endobj 45 0 obj -<< /Type /StructElem /S /mtd /P 101 0 R /K 46 0 R /NS 12 0 R /ID (ID.0023) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 44 0 R /K <> /ID (ID.0025) >> endobj 46 0 obj -<< /Type /StructElem /S /mn /P 45 0 R /K <> /NS 12 0 R /ID (ID.0024) >> +<< /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /K [ 47 0 R] /ID (ID.0026) >> endobj 47 0 obj -<< /Type /StructElem /S /mtext /K [ 48 0 R] /NS 12 0 R /ID (ID.0025) >> +<< /Type /StructElem /S /math /NS 13 0 R /P 46 0 R /K 48 0 R /ID (ID.0027) >> endobj 48 0 obj -<< /Type /StructElem /S /math /P 47 0 R /K 49 0 R /NS 12 0 R /ID (ID.0026) >> +<< /Type /StructElem /A 49 0 R /S /mstyle /NS 13 0 R /P 47 0 R /K [50 0 R 51 0 R 53 0 R] /ID (ID.0028) >> endobj -49 0 obj -<< /Type /StructElem /S /mstyle /P 48 0 R /K [51 0 R 52 0 R 54 0 R] /A 50 0 R /NS 12 0 R /ID (ID.0027) >> +50 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 48 0 R /ID (ID.0029) >> endobj 51 0 obj -<< /Type /StructElem /S /mi /P 49 0 R /K null /NS 12 0 R /ID (ID.0028) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 48 0 R /ID (ID.0030) >> endobj -52 0 obj -<< /Type /StructElem /S /mo /P 49 0 R /K null /A 53 0 R /NS 12 0 R /ID (ID.0029) >> +53 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 48 0 R /ID (ID.0031) >> endobj 54 0 obj -<< /Type /StructElem /S /mi /P 49 0 R /K null /NS 12 0 R /ID (ID.0030) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 69 0 R /K [<> 55 0 R] /ID (ID.0032) >> endobj 55 0 obj -<< /Type /StructElem /S /mtext /P 70 0 R /K [<> 56 0 R] /NS 12 0 R /ID (ID.0031) >> +<< /Type /StructElem /S /math /NS 13 0 R /P 54 0 R /K [56 0 R 57 0 R 58 0 R] /ID (ID.0033) >> endobj 56 0 obj -<< /Type /StructElem /S /math /P 55 0 R /K [57 0 R 58 0 R 59 0 R] /NS 12 0 R /ID (ID.0032) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 55 0 R /K <> /ID (ID.0034) >> endobj 57 0 obj -<< /Type /StructElem /S /mi /P 56 0 R /K <> /NS 12 0 R /ID (ID.0033) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 55 0 R /K <> /ID (ID.0035) >> endobj 58 0 obj -<< /Type /StructElem /S /mo /P 56 0 R /K <> /A 53 0 R /NS 12 0 R /ID (ID.0034) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 55 0 R /K <> /ID (ID.0036) >> endobj 59 0 obj -<< /Type /StructElem /S /mi /P 56 0 R /K <> /NS 12 0 R /ID (ID.0035) >> +<< /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /K [ 60 0 R] /ID (ID.0037) >> endobj 60 0 obj -<< /Type /StructElem /S /mtext /K [ 61 0 R] /NS 12 0 R /ID (ID.0036) >> +<< /Type /StructElem /S /math /NS 13 0 R /P 59 0 R /K [61 0 R 62 0 R 63 0 R] /ID (ID.0038) >> endobj 61 0 obj -<< /Type /StructElem /S /math /P 60 0 R /K [62 0 R 63 0 R 64 0 R] /NS 12 0 R /ID (ID.0037) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 60 0 R /ID (ID.0039) >> endobj 62 0 obj -<< /Type /StructElem /S /mi /P 61 0 R /K null /NS 12 0 R /ID (ID.0038) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 60 0 R /ID (ID.0040) >> endobj 63 0 obj -<< /Type /StructElem /S /mo /P 61 0 R /K null /A 53 0 R /NS 12 0 R /ID (ID.0039) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 60 0 R /ID (ID.0041) >> endobj 64 0 obj -<< /Type /StructElem /S /mi /P 61 0 R /K null /NS 12 0 R /ID (ID.0040) >> +<< /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /K [ 65 0 R] /ID (ID.0042) >> endobj 65 0 obj -<< /Type /StructElem /S /mtext /K [ 66 0 R] /NS 12 0 R /ID (ID.0041) >> +<< /Type /StructElem /S /math /NS 13 0 R /P 64 0 R /K [66 0 R 67 0 R 68 0 R] /ID (ID.0043) >> endobj 66 0 obj -<< /Type /StructElem /S /math /P 65 0 R /K [67 0 R 68 0 R 69 0 R] /NS 12 0 R /ID (ID.0042) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 65 0 R /ID (ID.0044) >> endobj 67 0 obj -<< /Type /StructElem /S /mi /P 66 0 R /K null /NS 12 0 R /ID (ID.0043) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 65 0 R /ID (ID.0045) >> endobj 68 0 obj -<< /Type /StructElem /S /mo /P 66 0 R /K null /A 53 0 R /NS 12 0 R /ID (ID.0044) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 65 0 R /ID (ID.0046) >> endobj 69 0 obj -<< /Type /StructElem /S /mi /P 66 0 R /K null /NS 12 0 R /ID (ID.0045) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 99 0 R /K [54 0 R 70 0 R] /ID (ID.0047) >> endobj 70 0 obj -<< /Type /StructElem /S /mtd /P 101 0 R /K [55 0 R 71 0 R] /NS 12 0 R /ID (ID.0046) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 69 0 R /ID (ID.0048) >> endobj 71 0 obj -<< /Type /StructElem /S /mi /P 70 0 R /A 72 0 R /NS 12 0 R /ID (ID.0047) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 100 0 R /K 72 0 R /ID (ID.0049) >> +endobj +72 0 obj +<< /Type /StructElem /S /mn /NS 13 0 R /P 71 0 R /K <> /ID (ID.0050) >> endobj 73 0 obj -<< /Type /StructElem /S /mtd /P 102 0 R /K 74 0 R /NS 12 0 R /ID (ID.0048) >> +<< /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /ID (ID.0051) >> endobj 74 0 obj -<< /Type /StructElem /S /mn /P 73 0 R /K <> /NS 12 0 R /ID (ID.0049) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 77 0 R /K <> /ID (ID.0052) >> endobj 75 0 obj -<< /Type /StructElem /S /mtext /K null /NS 12 0 R /ID (ID.0050) >> +<< /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /ID (ID.0053) >> endobj 76 0 obj -<< /Type /StructElem /S /mtext /P 79 0 R /K <> /NS 12 0 R /ID (ID.0051) >> +<< /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /ID (ID.0054) >> endobj 77 0 obj -<< /Type /StructElem /S /mtext /K null /NS 12 0 R /ID (ID.0052) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 100 0 R /K [74 0 R 78 0 R] /ID (ID.0055) >> endobj 78 0 obj -<< /Type /StructElem /S /mtext /K null /NS 12 0 R /ID (ID.0053) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 77 0 R /ID (ID.0056) >> endobj 79 0 obj -<< /Type /StructElem /S /mtd /P 102 0 R /K [76 0 R 80 0 R] /NS 12 0 R /ID (ID.0054) >> -endobj -80 0 obj -<< /Type /StructElem /S /mi /P 79 0 R /A 72 0 R /NS 12 0 R /ID (ID.0055) >> +<< /Type /StructElem /A 80 0 R /S /math /NS 13 0 R /P 25 0 R /K [81 0 R 94 0 R 95 0 R] /ID (ID.0057) >> endobj 81 0 obj -<< /Type /StructElem /S /math /P 26 0 R /K [83 0 R 96 0 R 97 0 R] /A 82 0 R /NS 12 0 R /ID (ID.0056) >> +<< /Type /StructElem /S /mrow /NS 13 0 R /P 79 0 R /K [82 0 R 84 0 R 86 0 R 92 0 R 93 0 R] /ID (ID.0058) >> endobj -83 0 obj -<< /Type /StructElem /S /mrow /P 81 0 R /K [84 0 R 86 0 R 88 0 R 94 0 R 95 0 R] /NS 12 0 R /ID (ID.0057) >> +82 0 obj +<< /Type /StructElem /A 83 0 R /ActualText /S /mo /NS 13 0 R /P 81 0 R /K <> /ID (ID.0059) >> endobj 84 0 obj -<< /Type /StructElem /S /mo /P 83 0 R /K <> /A 85 0 R /ActualText /NS 12 0 R /ID (ID.0058) >> +<< /Type /StructElem /A 85 0 R /S /mspace /NS 13 0 R /P 81 0 R /ID (ID.0060) >> endobj 86 0 obj -<< /Type /StructElem /S /mspace /P 83 0 R /A 87 0 R /NS 12 0 R /ID (ID.0059) >> +<< /Type /StructElem /A 87 0 R /S /mpadded /NS 13 0 R /P 81 0 R /K 88 0 R /ID (ID.0061) >> endobj 88 0 obj -<< /Type /StructElem /S /mpadded /P 83 0 R /K 90 0 R /A 89 0 R /NS 12 0 R /ID (ID.0060) >> +<< /Type /StructElem /S /mtable /NS 13 0 R /P 86 0 R /K [89 0 R 90 0 R 91 0 R] /ID (ID.0062) >> +endobj +89 0 obj +<< /Type /StructElem /S /mtr /NS 13 0 R /P 88 0 R /K [26 0 R 28 0 R 30 0 R] /ID (ID.0063) >> endobj 90 0 obj -<< /Type /StructElem /S /mtable /P 88 0 R /K [91 0 R 92 0 R 93 0 R] /NS 12 0 R /ID (ID.0061) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 88 0 R /K [32 0 R 34 0 R 36 0 R] /ID (ID.0064) >> endobj 91 0 obj -<< /Type /StructElem /S /mtr /P 90 0 R /K [27 0 R 29 0 R 31 0 R] /NS 12 0 R /ID (ID.0062) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 88 0 R /K [38 0 R 40 0 R 42 0 R] /ID (ID.0065) >> endobj 92 0 obj -<< /Type /StructElem /S /mtr /P 90 0 R /K [33 0 R 35 0 R 37 0 R] /NS 12 0 R /ID (ID.0063) >> +<< /Type /StructElem /A 85 0 R /S /mspace /NS 13 0 R /P 81 0 R /ID (ID.0066) >> endobj 93 0 obj -<< /Type /StructElem /S /mtr /P 90 0 R /K [39 0 R 41 0 R 43 0 R] /NS 12 0 R /ID (ID.0064) >> +<< /Type /StructElem /A 83 0 R /ActualText /S /mo /NS 13 0 R /P 81 0 R /K <> /ID (ID.0067) >> endobj 94 0 obj -<< /Type /StructElem /S /mspace /P 83 0 R /A 87 0 R /NS 12 0 R /ID (ID.0065) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 79 0 R /K <> /ID (ID.0068) >> endobj 95 0 obj -<< /Type /StructElem /S /mo /P 83 0 R /K <> /A 85 0 R /ActualText /NS 12 0 R /ID (ID.0066) >> +<< /Type /StructElem /S /mrow /NS 13 0 R /P 79 0 R /K [96 0 R 97 0 R 101 0 R] /ID (ID.0069) >> endobj 96 0 obj -<< /Type /StructElem /S /mo /P 81 0 R /K <> /A 53 0 R /NS 12 0 R /ID (ID.0067) >> +<< /Type /StructElem /A 83 0 R /ActualText /S /mo /NS 13 0 R /P 95 0 R /K <> /ID (ID.0070) >> endobj 97 0 obj -<< /Type /StructElem /S /mrow /P 81 0 R /K [98 0 R 99 0 R 103 0 R] /NS 12 0 R /ID (ID.0068) >> +<< /Type /StructElem /A 87 0 R /S /mpadded /NS 13 0 R /P 95 0 R /K 98 0 R /ID (ID.0071) >> endobj 98 0 obj -<< /Type /StructElem /S /mo /P 97 0 R /K <> /A 85 0 R /ActualText /NS 12 0 R /ID (ID.0069) >> +<< /Type /StructElem /S /mtable /NS 13 0 R /P 97 0 R /K [99 0 R 100 0 R] /ID (ID.0072) >> endobj 99 0 obj -<< /Type /StructElem /S /mpadded /P 97 0 R /K 100 0 R /A 89 0 R /NS 12 0 R /ID (ID.0070) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 98 0 R /K [44 0 R 69 0 R] /ID (ID.0073) >> endobj 100 0 obj -<< /Type /StructElem /S /mtable /P 99 0 R /K [101 0 R 102 0 R] /NS 12 0 R /ID (ID.0071) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 98 0 R /K [71 0 R 77 0 R] /ID (ID.0074) >> endobj 101 0 obj -<< /Type /StructElem /S /mtr /P 100 0 R /K [45 0 R 70 0 R] /NS 12 0 R /ID (ID.0072) >> +<< /Type /StructElem /A 102 0 R /S /mspace /NS 13 0 R /P 95 0 R /ID (ID.0075) >> endobj -102 0 obj -<< /Type /StructElem /S /mtr /P 100 0 R /K [73 0 R 79 0 R] /NS 12 0 R /ID (ID.0073) >> +105 0 obj +<< /Type /StructElem /AF [104 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 106 0 R /ID (ID.0076) >> endobj -103 0 obj -<< /Type /StructElem /S /mspace /P 97 0 R /A 104 0 R /NS 12 0 R /ID (ID.0074) >> +106 0 obj +<< /Type /StructElem /A 80 0 R /S /math /NS 13 0 R /P 105 0 R /K [107 0 R 108 0 R 109 0 R 128 0 R] /ID (ID.0077) >> endobj 107 0 obj -<< /Type /StructElem /S /Formula /P 23 0 R /K 108 0 R /AF [106 0 R] /NS 10 0 R /ID (ID.0075) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 106 0 R /K <> /ID (ID.0078) >> endobj 108 0 obj -<< /Type /StructElem /S /math /P 107 0 R /K [109 0 R 110 0 R 111 0 R 130 0 R] /A 82 0 R /NS 12 0 R /ID (ID.0076) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 106 0 R /K <> /ID (ID.0079) >> endobj 109 0 obj -<< /Type /StructElem /S /mi /P 108 0 R /K <> /NS 12 0 R /ID (ID.0077) >> +<< /Type /StructElem /S /mfrac /NS 13 0 R /P 106 0 R /K [110 0 R 125 0 R] /ID (ID.0080) >> endobj 110 0 obj -<< /Type /StructElem /S /mo /P 108 0 R /K <> /A 53 0 R /NS 12 0 R /ID (ID.0078) >> +<< /Type /StructElem /S /mrow /NS 13 0 R /P 109 0 R /K [111 0 R 113 0 R 114 0 R 116 0 R] /ID (ID.0081) >> endobj 111 0 obj -<< /Type /StructElem /S /mfrac /P 108 0 R /K [112 0 R 127 0 R] /NS 12 0 R /ID (ID.0079) >> -endobj -112 0 obj -<< /Type /StructElem /S /mrow /P 111 0 R /K [113 0 R 115 0 R 116 0 R 118 0 R] /NS 12 0 R /ID (ID.0080) >> +<< /Type /StructElem /A 112 0 R /S /mo /NS 13 0 R /P 110 0 R /K <> /ID (ID.0082) >> endobj 113 0 obj -<< /Type /StructElem /S /mo /P 112 0 R /K <> /A 114 0 R /NS 12 0 R /ID (ID.0081) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 110 0 R /K <> /ID (ID.0083) >> endobj -115 0 obj -<< /Type /StructElem /S /mi /P 112 0 R /K <> /NS 12 0 R /ID (ID.0082) >> +114 0 obj +<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 110 0 R /K <> /ID (ID.0084) >> endobj 116 0 obj -<< /Type /StructElem /S /mo /P 112 0 R /K <> /A 117 0 R /NS 12 0 R /ID (ID.0083) >> +<< /Type /StructElem /S /msqrt /NS 13 0 R /P 110 0 R /K 117 0 R /ID (ID.0085) >> +endobj +117 0 obj +<< /Type /StructElem /S /mrow /NS 13 0 R /P 116 0 R /K [118 0 R 121 0 R 122 0 R 123 0 R 124 0 R] /ID (ID.0086) >> endobj 118 0 obj -<< /Type /StructElem /S /msqrt /P 112 0 R /K 119 0 R /NS 12 0 R /ID (ID.0084) >> +<< /Type /StructElem /S /msup /NS 13 0 R /P 117 0 R /K [119 0 R 120 0 R] /ID (ID.0087) >> endobj 119 0 obj -<< /Type /StructElem /S /mrow /P 118 0 R /K [120 0 R 123 0 R 124 0 R 125 0 R 126 0 R] /NS 12 0 R /ID (ID.0085) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 118 0 R /K <> /ID (ID.0088) >> endobj 120 0 obj -<< /Type /StructElem /S /msup /P 119 0 R /K [121 0 R 122 0 R] /NS 12 0 R /ID (ID.0086) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 118 0 R /K <> /ID (ID.0089) >> endobj 121 0 obj -<< /Type /StructElem /S /mi /P 120 0 R /K <> /NS 12 0 R /ID (ID.0087) >> +<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 117 0 R /K <> /ID (ID.0090) >> endobj 122 0 obj -<< /Type /StructElem /S /mn /P 120 0 R /K <> /NS 12 0 R /ID (ID.0088) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 117 0 R /K <> /ID (ID.0091) >> endobj 123 0 obj -<< /Type /StructElem /S /mo /P 119 0 R /K <> /A 117 0 R /NS 12 0 R /ID (ID.0089) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 117 0 R /K <> /ID (ID.0092) >> endobj 124 0 obj -<< /Type /StructElem /S /mn /P 119 0 R /K <> /NS 12 0 R /ID (ID.0090) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 117 0 R /K <> /ID (ID.0093) >> endobj 125 0 obj -<< /Type /StructElem /S /mi /P 119 0 R /K <> /NS 12 0 R /ID (ID.0091) >> +<< /Type /StructElem /S /mrow /NS 13 0 R /P 109 0 R /K [126 0 R 127 0 R] /ID (ID.0094) >> endobj 126 0 obj -<< /Type /StructElem /S /mi /P 119 0 R /K <> /NS 12 0 R /ID (ID.0092) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 125 0 R /K <> /ID (ID.0095) >> endobj 127 0 obj -<< /Type /StructElem /S /mrow /P 111 0 R /K [128 0 R 129 0 R] /NS 12 0 R /ID (ID.0093) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 125 0 R /K <> /ID (ID.0096) >> endobj 128 0 obj -<< /Type /StructElem /S /mn /P 127 0 R /K <> /NS 12 0 R /ID (ID.0094) >> +<< /Type /StructElem /A 129 0 R /S /mo /NS 13 0 R /P 106 0 R /K <> /ID (ID.0097) >> endobj -129 0 obj -<< /Type /StructElem /S /mi /P 127 0 R /K <> /NS 12 0 R /ID (ID.0095) >> +132 0 obj +<< /Type /StructElem /AF [131 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 133 0 R /ID (ID.0098) >> endobj -130 0 obj -<< /Type /StructElem /S /mo /P 108 0 R /K <> /A 131 0 R /NS 12 0 R /ID (ID.0096) >> +133 0 obj +<< /Type /StructElem /A 80 0 R /S /math /NS 13 0 R /P 132 0 R /K [134 0 R 138 0 R 141 0 R 145 0 R] /ID (ID.0099) >> endobj 134 0 obj -<< /Type /StructElem /S /Formula /P 23 0 R /K 135 0 R /AF [133 0 R] /NS 10 0 R /ID (ID.0097) >> +<< /Type /StructElem /S /munder /NS 13 0 R /P 133 0 R /K [135 0 R 137 0 R] /ID (ID.0100) >> endobj 135 0 obj -<< /Type /StructElem /S /math /P 134 0 R /K [136 0 R 140 0 R 143 0 R 147 0 R] /A 82 0 R /NS 12 0 R /ID (ID.0098) >> -endobj -136 0 obj -<< /Type /StructElem /S /munder /P 135 0 R /K [137 0 R 139 0 R] /NS 12 0 R /ID (ID.0099) >> +<< /Type /StructElem /A 136 0 R /S /mo /NS 13 0 R /P 134 0 R /K <> /ID (ID.0101) >> endobj 137 0 obj -<< /Type /StructElem /S /mo /P 136 0 R /K <> /A 138 0 R /NS 12 0 R /ID (ID.0100) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 134 0 R /K <> /ID (ID.0102) >> +endobj +138 0 obj +<< /Type /StructElem /S /munder /NS 13 0 R /P 133 0 R /K [139 0 R 140 0 R] /ID (ID.0103) >> endobj 139 0 obj -<< /Type /StructElem /S /mi /P 136 0 R /K <> /NS 12 0 R /ID (ID.0101) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 138 0 R /K <> /ID (ID.0104) >> endobj 140 0 obj -<< /Type /StructElem /S /munder /P 135 0 R /K [141 0 R 142 0 R] /NS 12 0 R /ID (ID.0102) >> +<< /Type /StructElem /S /mo /NS 13 0 R /P 138 0 R /ID (ID.0105) >> endobj 141 0 obj -<< /Type /StructElem /S /mi /P 140 0 R /K <> /NS 12 0 R /ID (ID.0103) >> +<< /Type /StructElem /S /mover /NS 13 0 R /P 133 0 R /K [142 0 R 143 0 R] /ID (ID.0106) >> endobj 142 0 obj -<< /Type /StructElem /S /mo /P 140 0 R /NS 12 0 R /ID (ID.0104) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 141 0 R /K <> /ID (ID.0107) >> endobj 143 0 obj -<< /Type /StructElem /S /mover /P 135 0 R /K [144 0 R 145 0 R] /NS 12 0 R /ID (ID.0105) >> -endobj -144 0 obj -<< /Type /StructElem /S /mi /P 143 0 R /K <> /NS 12 0 R /ID (ID.0106) >> +<< /Type /StructElem /A 144 0 R /ActualText /S /mo /NS 13 0 R /P 141 0 R /K <> /ID (ID.0108) >> endobj 145 0 obj -<< /Type /StructElem /S /mo /P 143 0 R /K <> /A 146 0 R /ActualText /NS 12 0 R /ID (ID.0107) >> +<< /Type /StructElem /S /msup /NS 13 0 R /P 133 0 R /K [146 0 R 147 0 R] /ID (ID.0109) >> +endobj +146 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 145 0 R /K <> /ID (ID.0110) >> endobj 147 0 obj -<< /Type /StructElem /S /msup /P 135 0 R /K [148 0 R 149 0 R] /NS 12 0 R /ID (ID.0108) >> +<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 145 0 R /K <> /ID (ID.0111) >> endobj -148 0 obj -<< /Type /StructElem /S /mi /P 147 0 R /K <> /NS 12 0 R /ID (ID.0109) >> +151 0 obj +<< /Type /StructElem /AF [150 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 197 0 R /ID (ID.0112) >> endobj -149 0 obj -<< /Type /StructElem /S /mi /P 147 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0110) >> +152 0 obj +<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K [153 0 R 154 0 R 155 0 R] /ID (ID.0113) >> endobj 153 0 obj -<< /Type /StructElem /S /Formula /P 23 0 R /K 199 0 R /AF [152 0 R] /NS 10 0 R /ID (ID.0111) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 152 0 R /K <> /ID (ID.0114) >> endobj 154 0 obj -<< /Type /StructElem /S /mtd /P 202 0 R /K [155 0 R 156 0 R 157 0 R] /NS 12 0 R /ID (ID.0112) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 152 0 R /K <> /ID (ID.0115) >> endobj 155 0 obj -<< /Type /StructElem /S /mi /P 154 0 R /K <> /NS 12 0 R /ID (ID.0113) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 152 0 R /K <> /ID (ID.0116) >> endobj 156 0 obj -<< /Type /StructElem /S /mi /P 154 0 R /K <> /NS 12 0 R /ID (ID.0114) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K [157 0 R 158 0 R 159 0 R 160 0 R 161 0 R] /ID (ID.0117) >> endobj 157 0 obj -<< /Type /StructElem /S /mi /P 154 0 R /K <> /NS 12 0 R /ID (ID.0115) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /ID (ID.0118) >> endobj 158 0 obj -<< /Type /StructElem /S /mtd /P 202 0 R /K [159 0 R 160 0 R 161 0 R 162 0 R 163 0 R] /NS 12 0 R /ID (ID.0116) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 156 0 R /K <> /ID (ID.0119) >> endobj 159 0 obj -<< /Type /StructElem /S /mi /P 158 0 R /A 72 0 R /NS 12 0 R /ID (ID.0117) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /K <> /ID (ID.0120) >> endobj 160 0 obj -<< /Type /StructElem /S /mo /P 158 0 R /K <> /A 53 0 R /NS 12 0 R /ID (ID.0118) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /K <> /ID (ID.0121) >> endobj 161 0 obj -<< /Type /StructElem /S /mi /P 158 0 R /K <> /NS 12 0 R /ID (ID.0119) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /K <> /ID (ID.0122) >> endobj 162 0 obj -<< /Type /StructElem /S /mi /P 158 0 R /K <> /NS 12 0 R /ID (ID.0120) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 163 0 R /ID (ID.0123) >> endobj 163 0 obj -<< /Type /StructElem /S /mi /P 158 0 R /K <> /NS 12 0 R /ID (ID.0121) >> +<< /Type /StructElem /S /msup /NS 13 0 R /P 162 0 R /K [164 0 R 165 0 R] /ID (ID.0124) >> endobj 164 0 obj -<< /Type /StructElem /S /mtd /P 202 0 R /K 165 0 R /NS 12 0 R /ID (ID.0122) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 163 0 R /K <> /ID (ID.0125) >> endobj 165 0 obj -<< /Type /StructElem /S /msup /P 164 0 R /K [166 0 R 167 0 R] /NS 12 0 R /ID (ID.0123) >> +<< /Type /StructElem /S /mrow /NS 13 0 R /P 163 0 R /K [166 0 R 167 0 R] /ID (ID.0126) >> endobj 166 0 obj -<< /Type /StructElem /S /mi /P 165 0 R /K <> /NS 12 0 R /ID (ID.0124) >> +<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 165 0 R /K <> /ID (ID.0127) >> endobj 167 0 obj -<< /Type /StructElem /S /mrow /P 165 0 R /K [168 0 R 169 0 R] /NS 12 0 R /ID (ID.0125) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 165 0 R /K <> /ID (ID.0128) >> endobj 168 0 obj -<< /Type /StructElem /S /mi /P 167 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0126) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K [169 0 R 170 0 R 172 0 R 173 0 R] /ID (ID.0129) >> endobj 169 0 obj -<< /Type /StructElem /S /mi /P 167 0 R /K <> /NS 12 0 R /ID (ID.0127) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 168 0 R /ID (ID.0130) >> endobj 170 0 obj -<< /Type /StructElem /S /mtd /P 202 0 R /K [171 0 R 172 0 R 174 0 R 175 0 R] /NS 12 0 R /ID (ID.0128) >> -endobj -171 0 obj -<< /Type /StructElem /S /mi /P 170 0 R /A 72 0 R /NS 12 0 R /ID (ID.0129) >> +<< /Type /StructElem /A 171 0 R /S /mo /NS 13 0 R /P 168 0 R /K <> /ID (ID.0131) >> endobj 172 0 obj -<< /Type /StructElem /S /mo /P 170 0 R /K <> /A 173 0 R /NS 12 0 R /ID (ID.0130) >> +<< /Type /StructElem /A 171 0 R /S /mo /NS 13 0 R /P 168 0 R /K <> /ID (ID.0132) >> +endobj +173 0 obj +<< /Type /StructElem /S /mn /NS 13 0 R /P 168 0 R /K <> /ID (ID.0133) >> endobj 174 0 obj -<< /Type /StructElem /S /mo /P 170 0 R /K <> /A 173 0 R /NS 12 0 R /ID (ID.0131) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 203 0 R /K [175 0 R 177 0 R 178 0 R 179 0 R] /ID (ID.0134) >> endobj 175 0 obj -<< /Type /StructElem /S /mn /P 170 0 R /K <> /NS 12 0 R /ID (ID.0132) >> -endobj -176 0 obj -<< /Type /StructElem /S /mtd /P 205 0 R /K [177 0 R 179 0 R 180 0 R 181 0 R] /NS 12 0 R /ID (ID.0133) >> +<< /Type /StructElem /A 176 0 R /ActualText /S /mo /NS 13 0 R /P 174 0 R /K <> /ID (ID.0135) >> endobj 177 0 obj -<< /Type /StructElem /S /mo /P 176 0 R /K <> /A 178 0 R /ActualText /NS 12 0 R /ID (ID.0134) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 174 0 R /K <> /ID (ID.0136) >> +endobj +178 0 obj +<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 174 0 R /K <> /ID (ID.0137) >> endobj 179 0 obj -<< /Type /StructElem /S /mn /P 176 0 R /K <> /NS 12 0 R /ID (ID.0135) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 174 0 R /K <> /ID (ID.0138) >> endobj 180 0 obj -<< /Type /StructElem /S /mo /P 176 0 R /K <> /A 117 0 R /NS 12 0 R /ID (ID.0136) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 203 0 R /K [181 0 R 182 0 R 183 0 R 184 0 R] /ID (ID.0139) >> endobj 181 0 obj -<< /Type /StructElem /S /mn /P 176 0 R /K <> /NS 12 0 R /ID (ID.0137) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 180 0 R /ID (ID.0140) >> endobj 182 0 obj -<< /Type /StructElem /S /mtd /P 205 0 R /K [183 0 R 184 0 R 185 0 R 186 0 R] /NS 12 0 R /ID (ID.0138) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 180 0 R /K <> /ID (ID.0141) >> endobj 183 0 obj -<< /Type /StructElem /S /mi /P 182 0 R /A 72 0 R /NS 12 0 R /ID (ID.0139) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 180 0 R /K <> /ID (ID.0142) >> endobj 184 0 obj -<< /Type /StructElem /S /mo /P 182 0 R /K <> /A 53 0 R /NS 12 0 R /ID (ID.0140) >> +<< /Type /StructElem /A 176 0 R /ActualText /S /mo /NS 13 0 R /P 180 0 R /K <> /ID (ID.0143) >> endobj 185 0 obj -<< /Type /StructElem /S /mn /P 182 0 R /K <> /NS 12 0 R /ID (ID.0141) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 203 0 R /K 186 0 R /ID (ID.0144) >> endobj 186 0 obj -<< /Type /StructElem /S /mo /P 182 0 R /K <> /A 178 0 R /ActualText /NS 12 0 R /ID (ID.0142) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 185 0 R /ID (ID.0145) >> endobj 187 0 obj -<< /Type /StructElem /S /mtd /P 205 0 R /K 188 0 R /NS 12 0 R /ID (ID.0143) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 203 0 R /K 188 0 R /ID (ID.0146) >> endobj 188 0 obj -<< /Type /StructElem /S /mi /P 187 0 R /A 72 0 R /NS 12 0 R /ID (ID.0144) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 187 0 R /ID (ID.0147) >> endobj 189 0 obj -<< /Type /StructElem /S /mtd /P 205 0 R /K 190 0 R /NS 12 0 R /ID (ID.0145) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 206 0 R /K 190 0 R /ID (ID.0148) >> endobj 190 0 obj -<< /Type /StructElem /S /mi /P 189 0 R /A 72 0 R /NS 12 0 R /ID (ID.0146) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 189 0 R /K <> /ID (ID.0149) >> endobj 191 0 obj -<< /Type /StructElem /S /mtd /P 208 0 R /K 192 0 R /NS 12 0 R /ID (ID.0147) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 206 0 R /K 192 0 R /ID (ID.0150) >> endobj 192 0 obj -<< /Type /StructElem /S /mn /P 191 0 R /K <> /NS 12 0 R /ID (ID.0148) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 191 0 R /ID (ID.0151) >> endobj 193 0 obj -<< /Type /StructElem /S /mtd /P 208 0 R /K 194 0 R /NS 12 0 R /ID (ID.0149) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 206 0 R /K 194 0 R /ID (ID.0152) >> endobj 194 0 obj -<< /Type /StructElem /S /mi /P 193 0 R /A 72 0 R /NS 12 0 R /ID (ID.0150) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 193 0 R /ID (ID.0153) >> endobj 195 0 obj -<< /Type /StructElem /S /mtd /P 208 0 R /K 196 0 R /NS 12 0 R /ID (ID.0151) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 206 0 R /K 196 0 R /ID (ID.0154) >> endobj 196 0 obj -<< /Type /StructElem /S /mi /P 195 0 R /A 72 0 R /NS 12 0 R /ID (ID.0152) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 195 0 R /ID (ID.0155) >> endobj 197 0 obj -<< /Type /StructElem /S /mtd /P 208 0 R /K 198 0 R /NS 12 0 R /ID (ID.0153) >> +<< /Type /StructElem /A 80 0 R /S /math /NS 13 0 R /P 151 0 R /K 198 0 R /ID (ID.0156) >> endobj 198 0 obj -<< /Type /StructElem /S /mi /P 197 0 R /A 72 0 R /NS 12 0 R /ID (ID.0154) >> -endobj -199 0 obj -<< /Type /StructElem /S /math /P 153 0 R /K 200 0 R /A 82 0 R /NS 12 0 R /ID (ID.0155) >> +<< /Type /StructElem /A 199 0 R /S /mtable /NS 13 0 R /P 197 0 R /K [200 0 R 203 0 R 206 0 R] /ID (ID.0157) >> endobj 200 0 obj -<< /Type /StructElem /S /mtable /P 199 0 R /K [202 0 R 205 0 R 208 0 R] /A 201 0 R /NS 12 0 R /ID (ID.0156) >> +<< /Type /StructElem /S /mlabeledtr /NS 13 0 R /P 198 0 R /K [201 0 R 152 0 R 156 0 R 162 0 R 168 0 R] /ID (ID.0158) >> +endobj +201 0 obj +<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 202 0 R /ID (ID.0159) >> endobj 202 0 obj -<< /Type /StructElem /S /mlabeledtr /P 200 0 R /K [203 0 R 154 0 R 158 0 R 164 0 R 170 0 R] /NS 12 0 R /ID (ID.0157) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 201 0 R /ID (ID.0160) >> endobj 203 0 obj -<< /Type /StructElem /S /mtd /P 202 0 R /K 204 0 R /NS 12 0 R /ID (ID.0158) >> +<< /Type /StructElem /S /mlabeledtr /NS 13 0 R /P 198 0 R /K [204 0 R 174 0 R 180 0 R 185 0 R 187 0 R] /ID (ID.0161) >> endobj 204 0 obj -<< /Type /StructElem /S /mtext /P 203 0 R /NS 12 0 R /ID (ID.0159) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 203 0 R /K 205 0 R /ID (ID.0162) >> endobj 205 0 obj -<< /Type /StructElem /S /mlabeledtr /P 200 0 R /K [206 0 R 176 0 R 182 0 R 187 0 R 189 0 R] /NS 12 0 R /ID (ID.0160) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 204 0 R /ID (ID.0163) >> endobj 206 0 obj -<< /Type /StructElem /S /mtd /P 205 0 R /K 207 0 R /NS 12 0 R /ID (ID.0161) >> +<< /Type /StructElem /S /mlabeledtr /NS 13 0 R /P 198 0 R /K [207 0 R 189 0 R 191 0 R 193 0 R 195 0 R] /ID (ID.0164) >> endobj 207 0 obj -<< /Type /StructElem /S /mtext /P 206 0 R /NS 12 0 R /ID (ID.0162) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 206 0 R /K 208 0 R /ID (ID.0165) >> endobj 208 0 obj -<< /Type /StructElem /S /mlabeledtr /P 200 0 R /K [209 0 R 191 0 R 193 0 R 195 0 R 197 0 R] /NS 12 0 R /ID (ID.0163) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 207 0 R /ID (ID.0166) >> endobj -209 0 obj -<< /Type /StructElem /S /mtd /P 208 0 R /K 210 0 R /NS 12 0 R /ID (ID.0164) >> +211 0 obj +<< /Type /StructElem /AF [210 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 212 0 R /ID (ID.0167) >> endobj -210 0 obj -<< /Type /StructElem /S /mtext /P 209 0 R /NS 12 0 R /ID (ID.0165) >> +212 0 obj +<< /Type /StructElem /S /math /NS 13 0 R /P 211 0 R /K [213 0 R 214 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R] /ID (ID.0168) >> endobj 213 0 obj -<< /Type /StructElem /S /Formula /P 23 0 R /K 214 0 R /AF [212 0 R] /NS 10 0 R /ID (ID.0166) >> +<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 212 0 R /K <> /ID (ID.0169) >> endobj 214 0 obj -<< /Type /StructElem /S /math /P 213 0 R /K [215 0 R 219 0 R 221 0 R 222 0 R 223 0 R 224 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R] /NS 12 0 R /ID (ID.0167) >> -endobj -215 0 obj -<< /Type /StructElem /S /mrow /P 214 0 R /K [216 0 R 217 0 R 218 0 R] /NS 12 0 R /ID (ID.0168) >> +<< /Type /StructElem /A 215 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0170) >> endobj 216 0 obj -<< /Type /StructElem /S /mi /P 215 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0169) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 212 0 R /K <> /ID (ID.0171) >> endobj 217 0 obj -<< /Type /StructElem /S /mi /P 215 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0170) >> +<< /Type /StructElem /A 215 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0172) >> endobj 218 0 obj -<< /Type /StructElem /S /mi /P 215 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0171) >> +<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0173) >> endobj 219 0 obj -<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 220 0 R /NS 12 0 R /ID (ID.0172) >> +<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 212 0 R /K <> /ID (ID.0174) >> +endobj +220 0 obj +<< /Type /StructElem /A 215 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0175) >> endobj 221 0 obj -<< /Type /StructElem /S /mi /P 214 0 R /K <> /NS 12 0 R /ID (ID.0173) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 212 0 R /K <> /ID (ID.0176) >> endobj 222 0 obj -<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 220 0 R /NS 12 0 R /ID (ID.0174) >> +<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0177) >> endobj 223 0 obj -<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 117 0 R /NS 12 0 R /ID (ID.0175) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 212 0 R /K <> /ID (ID.0178) >> endobj 224 0 obj -<< /Type /StructElem /S /mrow /P 214 0 R /K [225 0 R 226 0 R 227 0 R] /NS 12 0 R /ID (ID.0176) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 212 0 R /K <> /ID (ID.0179) >> endobj 225 0 obj -<< /Type /StructElem /S /mi /P 224 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0177) >> +<< /Type /StructElem /A 215 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0180) >> endobj 226 0 obj -<< /Type /StructElem /S /mi /P 224 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0178) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0181) >> endobj 227 0 obj -<< /Type /StructElem /S /mi /P 224 0 R /K <> /A 150 0 R /NS 12 0 R /ID (ID.0179) >> -endobj -228 0 obj -<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 220 0 R /NS 12 0 R /ID (ID.0180) >> -endobj -229 0 obj -<< /Type /StructElem /S /mi /P 214 0 R /K <> /NS 12 0 R /ID (ID.0181) >> -endobj -230 0 obj -<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 117 0 R /NS 12 0 R /ID (ID.0182) >> -endobj -231 0 obj -<< /Type /StructElem /S /mn /P 214 0 R /K <> /NS 12 0 R /ID (ID.0183) >> -endobj -232 0 obj -<< /Type /StructElem /S /mi /P 214 0 R /K <> /NS 12 0 R /ID (ID.0184) >> -endobj -233 0 obj -<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 220 0 R /NS 12 0 R /ID (ID.0185) >> -endobj -234 0 obj -<< /Type /StructElem /S /mo /P 214 0 R /K <> /A 53 0 R /NS 12 0 R /ID (ID.0186) >> -endobj -235 0 obj -<< /Type /StructElem /S /mn /P 214 0 R /K <> /NS 12 0 R /ID (ID.0187) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 212 0 R /K <> /ID (ID.0182) >> endobj 5 0 obj -<< /Type /StructTreeRoot /K 22 0 R /IDTree 251 0 R /ParentTree 6 0 R /Namespaces 7 0 R >> +<< /Type /StructTreeRoot /Namespaces 8 0 R /IDTree 243 0 R /ParentTree 6 0 R /RoleMap 7 0 R /K 21 0 R >> endobj -252 0 obj +244 0 obj [ 66 [ 323 ] ] endobj -254 0 obj +246 0 obj << /Subtype /CIDFontType0C /Length 592 >> [BINARY STREAM] endobj -253 0 obj -<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 254 0 R >> +245 0 obj +<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 246 0 R >> endobj -255 0 obj +247 0 obj << /Length 687 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1578,23 +1551,23 @@ end %%EOF endstream endobj -244 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 256 0 R ] /ToUnicode 255 0 R >> +236 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 248 0 R ] /ToUnicode 247 0 R >> endobj -256 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 253 0 R /W 252 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +248 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 245 0 R /W 244 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -257 0 obj +249 0 obj [ 1013 [ 569 ] 1404 [ 620 ] 2981 [ 407 ] 4558 [ 668 ] ] endobj -259 0 obj +251 0 obj << /Subtype /CIDFontType0C /Length 1102 >> [BINARY STREAM] endobj -258 0 obj -<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 259 0 R >> +250 0 obj +<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 251 0 R >> endobj -260 0 obj +252 0 obj << /Length 772 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1633,23 +1606,23 @@ end %%EOF endstream endobj -243 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 261 0 R ] /ToUnicode 260 0 R >> +235 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 253 0 R ] /ToUnicode 252 0 R >> endobj -261 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 258 0 R /W 257 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +253 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 250 0 R /W 249 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -262 0 obj +254 0 obj [ 9 [ 389 389 ] 12 [ 778 ] 15 [ 278 ] 17 [ 500 500 500 500 500 500 ] 30 [ 778 ] 1296 [ 529 429 433 520 466 490 ] 1319 [ 572 ] 1790 [ 0 ] 2455 [ 663 663 ] 2503 [ 875 875 875 875 875 875 ] 2515 [ 902 ] 2615 [ 778 ] 2619 [ 778 ] 3074 [ 1444 ] 3077 [ 833 ] 4474 [ 570 ] ] endobj -264 0 obj +256 0 obj << /Subtype /CIDFontType0C /Length 4088 >> [BINARY STREAM] endobj -263 0 obj -<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 264 0 R >> +255 0 obj +<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 256 0 R >> endobj -265 0 obj +257 0 obj << /Length 1203 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1717,23 +1690,23 @@ end %%EOF endstream endobj -242 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 266 0 R ] /ToUnicode 265 0 R >> +234 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 258 0 R ] /ToUnicode 257 0 R >> endobj -266 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 263 0 R /W 262 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +258 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 255 0 R /W 254 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -267 0 obj +259 0 obj [ 49 [ 681 444 ] 55 [ 306 ] 59 [ 500 ] 63 [ 556 ] 66 [ 278 ] 72 [ 278 ] 77 [ 556 ] 81 [ 500 500 ] 85 [ 389 389 ] 88 [ 278 ] 98 [ 394 ] 103 [ 333 ] 105 [ 389 500 500 ] ] endobj -269 0 obj +261 0 obj << /Subtype /CIDFontType0C /Length 2411 >> [BINARY STREAM] endobj -268 0 obj -<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 269 0 R >> +260 0 obj +<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 261 0 R >> endobj -270 0 obj +262 0 obj << /Length 931 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1786,299 +1759,291 @@ end %%EOF endstream endobj -241 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 271 0 R ] /ToUnicode 270 0 R >> +233 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 263 0 R ] /ToUnicode 262 0 R >> endobj -271 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 268 0 R /W 267 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +263 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 260 0 R /W 259 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -245 0 obj -<< /Type /Pages /Count 1 /Kids [ 239 0 R ] >> +237 0 obj +<< /Type /Pages /Count 1 /Kids [ 231 0 R ] >> endobj -272 0 obj -<< /Type /Catalog /Pages 245 0 R /MarkInfo 246 0 R/Lang (en-US)/Metadata 237 0 R/StructTreeRoot 5 0 R >> +264 0 obj +<< /Type /Catalog /Pages 237 0 R /MarkInfo 238 0 R/Lang (en)/Metadata 229 0 R/StructTreeRoot 5 0 R >> endobj -273 0 obj -<< /Producer (LuaTeX)/Creator (TeX)/CreationDate (D:20010101205959-00'00')/ModDate (D:20010101205959-00'00') /Trapped /False >> +265 0 obj +<< /Producer (LuaTeX)/Creator (TeX)/CreationDate (D:20160520090000Z)/ModDate (D:20160520090000Z) /Trapped /False >> endobj xref -0 274 +0 266 0000000002 65535 f -0000026277 00000 n +0000025623 00000 n 0000000003 00000 f 0000000004 00000 f -0000000009 00000 f -0000054118 00000 n -0000026361 00000 n -0000032049 00000 n -0000030631 00000 n -0000000011 00000 f -0000030699 00000 n -0000000013 00000 f -0000030769 00000 n -0000000021 00000 f -0000031267 00000 n -0000030850 00000 n -0000031545 00000 n -0000031374 00000 n -0000031853 00000 n -0000031652 00000 n -0000031962 00000 n +0000000010 00000 f +0000052921 00000 n +0000025707 00000 n +0000029835 00000 n +0000031787 00000 n +0000030414 00000 n +0000000012 00000 f +0000030482 00000 n +0000000014 00000 f +0000030552 00000 n +0000000020 00000 f +0000031315 00000 n +0000030633 00000 n +0000031593 00000 n +0000031422 00000 n +0000031700 00000 n 0000000000 00000 f -0000032117 00000 n -0000032216 00000 n -0000032357 00000 n -0000001942 00000 n -0000032479 00000 n -0000032591 00000 n -0000032686 00000 n -0000032809 00000 n -0000032904 00000 n -0000033027 00000 n -0000033122 00000 n -0000033245 00000 n -0000033340 00000 n -0000033463 00000 n -0000033558 00000 n -0000033681 00000 n -0000033776 00000 n -0000033899 00000 n -0000033994 00000 n -0000034117 00000 n -0000034212 00000 n -0000034335 00000 n -0000034430 00000 n -0000034554 00000 n -0000034650 00000 n -0000034774 00000 n -0000034864 00000 n -0000034960 00000 n +0000031848 00000 n +0000031947 00000 n +0000032088 00000 n +0000001680 00000 n +0000032210 00000 n +0000032322 00000 n +0000032417 00000 n +0000032540 00000 n +0000032635 00000 n +0000032758 00000 n +0000032853 00000 n +0000032976 00000 n +0000033071 00000 n +0000033194 00000 n +0000033289 00000 n +0000033412 00000 n +0000033507 00000 n +0000033630 00000 n +0000033725 00000 n +0000033848 00000 n +0000033943 00000 n +0000034066 00000 n +0000034161 00000 n +0000034285 00000 n +0000034380 00000 n +0000034504 00000 n +0000034606 00000 n +0000034702 00000 n 0000000020 00000 n -0000035085 00000 n -0000035177 00000 n -0000000093 00000 n -0000035280 00000 n -0000035372 00000 n -0000035508 00000 n -0000035620 00000 n -0000035744 00000 n -0000035879 00000 n -0000036003 00000 n -0000036093 00000 n -0000036205 00000 n -0000036297 00000 n -0000036400 00000 n -0000036492 00000 n -0000036582 00000 n -0000036694 00000 n -0000036786 00000 n -0000036889 00000 n -0000036981 00000 n -0000037086 00000 n -0000000164 00000 n -0000037181 00000 n -0000037277 00000 n -0000037401 00000 n -0000037486 00000 n -0000037613 00000 n -0000037698 00000 n -0000037783 00000 n -0000037888 00000 n -0000037983 00000 n -0000000219 00000 n -0000038106 00000 n -0000038232 00000 n -0000000273 00000 n -0000038389 00000 n -0000000360 00000 n -0000038488 00000 n -0000000415 00000 n -0000038598 00000 n -0000038712 00000 n -0000038823 00000 n -0000038934 00000 n -0000039045 00000 n -0000039144 00000 n -0000039302 00000 n -0000039437 00000 n -0000039550 00000 n -0000039708 00000 n -0000039819 00000 n -0000039929 00000 n -0000040035 00000 n -0000040141 00000 n -0000000487 00000 n -0000000542 00000 n -0000003013 00000 n -0000040242 00000 n -0000040357 00000 n -0000040493 00000 n -0000040619 00000 n -0000040756 00000 n -0000040866 00000 n -0000040991 00000 n -0000002122 00000 n -0000041129 00000 n -0000041255 00000 n -0000002188 00000 n -0000041393 00000 n -0000041493 00000 n -0000041626 00000 n -0000041735 00000 n -0000041861 00000 n -0000041987 00000 n -0000042125 00000 n -0000042251 00000 n -0000042377 00000 n -0000042503 00000 n -0000042612 00000 n -0000042738 00000 n -0000042864 00000 n -0000002260 00000 n -0000002320 00000 n -0000003883 00000 n -0000043002 00000 n -0000043117 00000 n -0000043253 00000 n -0000043364 00000 n -0000003194 00000 n -0000043502 00000 n +0000034827 00000 n +0000034911 00000 n +0000000092 00000 n +0000035006 00000 n +0000035090 00000 n +0000035226 00000 n +0000035338 00000 n +0000035462 00000 n +0000035597 00000 n +0000035721 00000 n +0000035823 00000 n +0000035935 00000 n +0000036019 00000 n +0000036114 00000 n +0000036198 00000 n +0000036300 00000 n +0000036412 00000 n +0000036496 00000 n +0000036591 00000 n +0000036675 00000 n +0000036779 00000 n +0000036863 00000 n +0000036959 00000 n +0000037083 00000 n +0000037172 00000 n +0000037299 00000 n +0000037388 00000 n +0000037477 00000 n +0000037582 00000 n +0000037666 00000 n +0000000162 00000 n +0000037789 00000 n +0000037915 00000 n +0000000215 00000 n +0000038072 00000 n +0000000301 00000 n +0000038171 00000 n +0000000355 00000 n +0000038281 00000 n +0000038395 00000 n +0000038506 00000 n +0000038617 00000 n +0000038728 00000 n +0000038827 00000 n +0000038985 00000 n +0000039120 00000 n +0000039233 00000 n +0000039391 00000 n +0000039501 00000 n +0000039609 00000 n +0000039713 00000 n +0000039818 00000 n +0000000426 00000 n +0000000480 00000 n +0000002591 00000 n +0000039919 00000 n +0000040034 00000 n +0000040170 00000 n +0000040296 00000 n +0000040433 00000 n +0000040543 00000 n +0000040668 00000 n +0000001832 00000 n +0000040806 00000 n +0000040932 00000 n +0000001897 00000 n +0000041070 00000 n +0000041170 00000 n +0000041303 00000 n +0000041412 00000 n +0000041538 00000 n +0000041664 00000 n +0000041802 00000 n +0000041928 00000 n +0000042054 00000 n +0000042180 00000 n +0000042289 00000 n +0000042415 00000 n +0000042541 00000 n +0000001968 00000 n +0000002027 00000 n +0000003353 00000 n +0000042679 00000 n +0000042794 00000 n +0000042930 00000 n +0000043041 00000 n +0000002744 00000 n +0000043179 00000 n +0000043305 00000 n +0000043416 00000 n +0000043542 00000 n 0000043628 00000 n -0000043739 00000 n -0000043865 00000 n -0000043951 00000 n -0000044061 00000 n -0000044187 00000 n -0000003280 00000 n -0000044348 00000 n -0000044457 00000 n -0000044583 00000 n -0000003335 00000 n -0000003395 00000 n -0000005872 00000 n -0000044721 00000 n -0000044836 00000 n -0000044952 00000 n -0000045078 00000 n -0000045204 00000 n -0000045330 00000 n -0000045462 00000 n -0000045559 00000 n -0000045696 00000 n -0000045822 00000 n -0000045948 00000 n -0000046074 00000 n -0000046172 00000 n -0000046281 00000 n -0000046407 00000 n -0000046516 00000 n -0000046654 00000 n -0000046780 00000 n -0000046904 00000 n -0000047001 00000 n -0000004064 00000 n -0000047139 00000 n -0000047277 00000 n -0000047403 00000 n -0000047527 00000 n -0000004130 00000 n -0000047688 00000 n -0000047814 00000 n -0000047952 00000 n -0000048078 00000 n -0000048202 00000 n -0000048299 00000 n -0000048436 00000 n -0000048562 00000 n -0000048723 00000 n -0000048821 00000 n -0000048918 00000 n -0000049016 00000 n -0000049113 00000 n -0000049211 00000 n -0000049337 00000 n -0000049435 00000 n -0000049532 00000 n -0000049630 00000 n -0000049727 00000 n -0000049825 00000 n -0000049922 00000 n -0000050032 00000 n -0000004254 00000 n -0000050163 00000 n -0000050302 00000 n -0000050400 00000 n -0000050489 00000 n -0000050628 00000 n -0000050726 00000 n -0000050815 00000 n -0000050954 00000 n -0000051052 00000 n -0000004372 00000 n -0000007184 00000 n -0000051141 00000 n -0000051256 00000 n -0000051461 00000 n -0000051578 00000 n -0000051716 00000 n -0000051854 00000 n -0000051992 00000 n -0000006053 00000 n +0000043738 00000 n +0000043864 00000 n +0000002829 00000 n +0000044025 00000 n +0000044134 00000 n +0000044260 00000 n +0000002883 00000 n +0000002942 00000 n +0000005031 00000 n +0000044398 00000 n +0000044513 00000 n +0000044629 00000 n +0000044755 00000 n +0000044881 00000 n +0000045007 00000 n +0000045139 00000 n +0000045225 00000 n +0000045362 00000 n +0000045488 00000 n +0000045614 00000 n +0000045740 00000 n +0000045838 00000 n +0000045947 00000 n +0000046073 00000 n +0000046182 00000 n +0000046320 00000 n +0000046446 00000 n +0000046570 00000 n +0000046656 00000 n +0000003506 00000 n +0000046794 00000 n +0000046932 00000 n +0000047058 00000 n +0000047182 00000 n +0000003571 00000 n +0000047343 00000 n +0000047469 00000 n +0000047607 00000 n +0000047733 00000 n +0000047857 00000 n +0000047943 00000 n +0000048080 00000 n +0000048206 00000 n +0000048367 00000 n +0000048465 00000 n +0000048551 00000 n +0000048649 00000 n +0000048735 00000 n +0000048833 00000 n +0000048959 00000 n +0000049057 00000 n +0000049143 00000 n +0000049241 00000 n +0000049327 00000 n +0000049425 00000 n +0000049511 00000 n +0000049621 00000 n +0000003694 00000 n +0000049752 00000 n +0000049891 00000 n +0000049989 00000 n +0000050078 00000 n +0000050217 00000 n +0000050315 00000 n +0000050404 00000 n +0000050543 00000 n +0000050641 00000 n +0000003811 00000 n +0000005865 00000 n +0000050730 00000 n +0000050845 00000 n +0000051050 00000 n +0000051188 00000 n +0000005184 00000 n +0000051326 00000 n +0000051452 00000 n +0000051590 00000 n +0000051728 00000 n +0000051866 00000 n +0000052004 00000 n 0000052130 00000 n -0000052256 00000 n +0000052268 00000 n 0000052394 00000 n -0000052532 00000 n -0000052649 00000 n -0000052787 00000 n -0000052925 00000 n -0000053063 00000 n -0000053201 00000 n -0000053327 00000 n -0000053465 00000 n -0000053591 00000 n -0000053717 00000 n -0000053855 00000 n -0000053992 00000 n -0000006129 00000 n -0000007365 00000 n -0000026173 00000 n -0000026034 00000 n -0000017798 00000 n -0000069179 00000 n -0000064910 00000 n -0000058586 00000 n -0000055904 00000 n -0000069539 00000 n -0000026324 00000 n -0000027024 00000 n -0000027936 00000 n -0000028878 00000 n -0000029840 00000 n -0000030568 00000 n -0000054224 00000 n -0000054933 00000 n -0000054256 00000 n -0000055156 00000 n -0000056060 00000 n -0000056262 00000 n -0000057522 00000 n -0000056335 00000 n -0000057753 00000 n -0000058749 00000 n -0000058958 00000 n -0000063416 00000 n -0000059243 00000 n -0000063646 00000 n -0000065073 00000 n -0000065282 00000 n -0000067964 00000 n -0000065468 00000 n -0000068187 00000 n -0000069336 00000 n -0000069603 00000 n -0000069725 00000 n +0000052520 00000 n +0000052658 00000 n +0000052795 00000 n +0000005259 00000 n +0000006018 00000 n +0000025519 00000 n +0000025380 00000 n +0000017471 00000 n +0000067997 00000 n +0000063728 00000 n +0000057404 00000 n +0000054722 00000 n +0000068357 00000 n +0000025670 00000 n +0000026338 00000 n +0000027250 00000 n +0000028190 00000 n +0000029152 00000 n +0000029772 00000 n +0000053042 00000 n +0000053751 00000 n +0000053074 00000 n +0000053974 00000 n +0000054878 00000 n +0000055080 00000 n +0000056340 00000 n +0000055153 00000 n +0000056571 00000 n +0000057567 00000 n +0000057776 00000 n +0000062234 00000 n +0000058061 00000 n +0000062464 00000 n +0000063891 00000 n +0000064100 00000 n +0000066782 00000 n +0000064286 00000 n +0000067005 00000 n +0000068154 00000 n +0000068421 00000 n +0000068540 00000 n trailer -<< /Size 274 /Root 272 0 R /Info 273 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> +<< /Size 266 /Root 264 0 R /Info 265 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> startxref -69870 +68673 %%EOF diff --git a/testfiles-lua/test_xml.mlr b/testfiles-lua/test_xml.mlr index f367c71..ab9f5ed 100644 --- a/testfiles-lua/test_xml.mlr +++ b/testfiles-lua/test_xml.mlr @@ -1,27 +1,27 @@ - + ๐‘Ž - = + = ๐‘ - + ๐‘Ž - = + = ๐‘ - + ๐‘Ž - = + = ๐‘ - + ๐‘Ž - = + = ๐‘ - - + + ( @@ -64,8 +64,8 @@ ) - = - + = + { @@ -75,12 +75,12 @@ if  - + ๐‘Ž - = + = ๐‘ - + @@ -89,7 +89,7 @@ else - + @@ -97,21 +97,21 @@ - + ๐‘ฅ - = + = - โˆ’ + โˆ’ ๐‘ - ยฑ + ยฑ ๐‘ 2 - โˆ’ + โˆ’ 4 ๐‘Ž ๐‘ @@ -123,11 +123,11 @@ ๐‘Ž - . + . - + - โˆ‘ + โˆ‘ ๐‘Ž @@ -143,7 +143,7 @@ โ€ฒ - + @@ -155,8 +155,8 @@ ๐‘ - - = + + = ๐‘‘ ๐‘’ ๐‘“ @@ -165,15 +165,15 @@ ๐‘’ - i + i ๐œ‹ - - = - โˆ’ + + = + โˆ’ 1 @@ -184,20 +184,20 @@ ( 1 - + + + 2 - - = + + = 3 ) - + - + @@ -208,38 +208,30 @@ 5 - + - + - + - - - s - i - n - - ( + + sin + ( ๐‘ฅ - ) - โˆ’ - - s - i - n - - ( + ) + โˆ’ + sin + ( ๐‘ฅ - + + + 2 ๐œ‹ - ) - = + ) + = 0 diff --git a/testfiles-pdf/test.mlr b/testfiles-pdf/test.mlr index d0165a8..d1bd6fb 100644 --- a/testfiles-pdf/test.mlr +++ b/testfiles-pdf/test.mlr @@ -1,51 +1,51 @@ - - โˆ… - โŠง - ( - ( - ๐‘ - โ‡’ - ๐‘ž - ) - โ‡’ - ( - ๐‘ž - โ‡’ - ๐‘Ÿ - ) - ) - โ‡’ - ( - ๐‘ - โ‡’ - ( - ๐‘ž - โ‡’ - ๐‘Ÿ - ) - ) + + โˆ… + โŠง + ( + ( + ๐‘ + โ‡’ + ๐‘ž + ) + โ‡’ + ( + ๐‘ž + โ‡’ + ๐‘Ÿ + ) + ) + โ‡’ + ( + ๐‘ + โ‡’ + ( + ๐‘ž + โ‡’ + ๐‘Ÿ + ) + ) - - + + s i n - ( - ๐‘ฅ - ) - โˆ’ - + ( + ๐‘ฅ + ) + โˆ’ + s i n - ( - ๐‘ฅ - + + ( + ๐‘ฅ + + 2 - ๐œ‹ - ) - = + ๐œ‹ + ) + = 0 From 2656c8615853ffcaf69891eae236d95cb3692a2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 15 Aug 2024 20:22:04 +0200 Subject: [PATCH 115/206] Remove old test files --- test_structelem.tex | 31 ----------------------------- test_tex.tex | 48 --------------------------------------------- 2 files changed, 79 deletions(-) delete mode 100644 test_structelem.tex delete mode 100644 test_tex.tex diff --git a/test_structelem.tex b/test_structelem.tex deleted file mode 100644 index f493731..0000000 --- a/test_structelem.tex +++ /dev/null @@ -1,31 +0,0 @@ -% !Mode:: "TeX:DE:UTF-8:Main" -\PassOptionsToPackage{enable-debug,check-declarations}{expl3} -\DocumentMetadata{uncompress,pdfversion=2.0,testphase = phase-I} -\RequirePackage{expl3} -\documentclass{article} -\usepackage{unicode-math} -\usepackage{amsmath} -\usepackage{luamml} -% \RegisterFamilyMapping\symsymbols{oms} -% \RegisterFamilyMapping\symletters{oml} -% \RegisterFamilyMapping\symlargesymbols{omx} -\ExplSyntaxOn - -\luamml_flag_structelem: -\int_new:N \g__my_mathml_int -\luamml_set_filename:n { - \immediateassignment \int_gincr:N \g__my_mathml_int - \jobname -formula- \int_use:N \g__my_mathml_int .xml -} -\ExplSyntaxOff -\begin{document} -\tagstructbegin{tag=Document} -\tagstructbegin{tag=Formula} -\[ - ax^2+bx+c=0,\quad - \int_1^n f(x) = \sum_{i=1}^m x^4 dx -\] -\tagstructend -\tagstructend - -\end{document} diff --git a/test_tex.tex b/test_tex.tex deleted file mode 100644 index d3aedaa..0000000 --- a/test_tex.tex +++ /dev/null @@ -1,48 +0,0 @@ -\DocumentMetadata{ - uncompress, - pdfversion = 2.0, - testphase = phase-I, -} -\documentclass{article} -\usepackage{luamml-demo} - -\usepackage{unicode-math} - -\begin{document} -\tagstructbegin{tag=Document} -\LuaMMLTagAF{} { -\[ - \begin{pmatrix} - 1 & 0 & 0 \\ - 0 & 1 & 0 \\ - 0 & 0 & 1 - \end{pmatrix} - = - \begin{cases} - 1 & $if $a=b\\ - 2 & $else$ - \end{cases} -\] -} -\LuaMMLTagAF{} { -\[ - x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}. -\] -} -\LuaMMLTagAF{} { -\[ - \sum_a\underline c\dot bc' -\] -} - -\LuaMMLTagAF{} { -\begin{align} - abc&=def & e^{\mathrm{i}\pi}&=-1\\ - \Big(1+2&=3\Big)\\ - 5 -\end{align} -} - -Es gilt \LuaMMLTagAF{}{$\sin(x)-\sin(x+2\pi)=0$}. -\tagstructend -\end{document} From 9c757878ee24484ede0e455a4640f54922ae495c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 15 Aug 2024 20:30:04 +0200 Subject: [PATCH 116/206] Fix typos --- luamml.dtx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/luamml.dtx b/luamml.dtx index 0af076c..7815ac5 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -49,9 +49,9 @@ % % \fi % -% \GetFileInfo{luamml.dtx} +% \GetFileInfo{luamml.sty} % \title{The \pkg{luamml} package% -% \thanks{This doument corresponds to \pkg{luamml}~\fileversion, dated~\filedate.}% +% \thanks{This document corresponds to \pkg{luamml}~\fileversion, dated~\filedate.}% % } % \author{Marcel Krรผger} % @@ -76,7 +76,7 @@ % \begin{verbatim} % \usepackage[l3build]{luamml-demo} % \end{verbatim} -% will generate a single file witha concatenation of all MathML blocks. +% will generate a single file with a concatenation of all MathML blocks. % % For automated use, the \pkg{luamml} package can be included directly, followed by enclosing blocks which should generate files with \cmd{luamml_begin_single_file:} and \cmd{luamml_end_single_file:}. % The filename can be set with \cmd{luamml_set_filename:n}. @@ -93,9 +93,9 @@ % } % \end{verbatim} % produces a |TeX| element in the output instead of trying to import \TeX~as a mathematical expression. -% The table structure is explaned in an appendix. +% The table structure is explained in an appendix. % -% \section{Features \& Limitiations} +% \section{Features \& Limitations} % Currently all mathematical expressions which purely contain Unicode encoded math mode material without embedded non-math should get converted successfully. % Usage with non-Unicode math (\TeX's 8-bit math fonts) is highly experimental and undocumented. % Any attempt to build complicated structures by embedding arbitrary \TeX\ code in the middle of math mode needs to have a MathML replacement specified. From 92d3b9bd5bd62054f6a4d404ae277df661dc25ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 24 Aug 2024 14:18:09 +0200 Subject: [PATCH 117/206] Adapt array patch for new array version --- luamml-patches-array.sty | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/luamml-patches-array.sty b/luamml-patches-array.sty index ee40b2c..d0f3821 100644 --- a/luamml-patches-array.sty +++ b/luamml-patches-array.sty @@ -56,18 +56,18 @@ \do@row@strut \or \setbox \ar@mcellbox \vbox \@startpbox { \@nextchar } - \insert@column + \insert@pcolumn \@endpbox \ar@align@mcell \do@row@strut \or \vtop \@startpbox { \@nextchar } - \insert@column + \insert@pcolumn \@endpbox \do@row@strut \or \vbox \@startpbox { \@nextchar } - \insert@column + \insert@pcolumn \@endpbox \do@row@strut \fi @@ -75,12 +75,27 @@ \prepnext@tok } -\cs_set:Npn \endarray { - \crcr - \__luamml_array_save_array: - \egroup - \egroup - \mode_if_math:T { \__luamml_array_finalize_array: } - \@arrayright - \gdef \@preamble {} +\IfPackageAtLeastTF {array} {2023/12/11} { + \cs_set:Npn \endarray { + \tbl_crcr:n{endarray} + \__luamml_array_save_array: + \egroup + \UseTaggingSocket{tbl/finalize} + \tbl_restore_outer_cell_data: + \egroup + \mode_if_math:T { \__luamml_array_finalize_array: } + \@arrayright + \gdef \@preamble {} + } +} { + \cs_new_eq:NN \insert@pcolumn \insert@column + \cs_set:Npn \endarray { + \crcr + \__luamml_array_save_array: + \egroup + \egroup + \mode_if_math:T { \__luamml_array_finalize_array: } + \@arrayright + \gdef \@preamble {} + } } From 071cf905490d8d247181e0086ba83964e3aeeeaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sat, 19 Oct 2024 10:09:17 +0200 Subject: [PATCH 118/206] Fix formatting --- support/luamml-algorithm.tex | 196 +++++++++++++++++------------------ 1 file changed, 98 insertions(+), 98 deletions(-) diff --git a/support/luamml-algorithm.tex b/support/luamml-algorithm.tex index 507a0bd..0f06311 100644 --- a/support/luamml-algorithm.tex +++ b/support/luamml-algorithm.tex @@ -1,98 +1,98 @@ -\newcommand\Luamml{\pkg{Luamml}} -\newcommand\luamml{\pkg{luamml}} -\newcommand\xmltag[1]{\texttt{<#1>}} -\section{\Luamml's representation of XML and MathML} -In the following I assume basic familiarity with both Lua\TeX's representation of math noads and MathML. - -\subsection{Representation of XML elements} -In many places, \luamml\ passes around XML elements. Every element is represented by a Lua table. -Element \texttt 0 must always be present and is a string representing the tag name. -The positive integer elements of the table represent child elements (either strings for direct text content or nested tables for nested elements). -All string members which do not start with a colon are attributes, whose value is the result of applying \texttt{tostring} to the field value. -This implies that these values should almost always be strings, except that the value \texttt 0 (since it never needs a unit) can often be set as a number. -For example the XML document -\begin{verbatim} - - 0 - < - x - -\end{verbatim} -would be represented by the Lua table -\begin{verbatim} -{[0] = "math", block="display", - {[0] = "mn", "0"}, - {[0] = "mo", "<"}, - {[0] = "mi", mathvariant="normal", "x"} -} -\end{verbatim} - -\subsection{Expression cores} -MathML knows the concept of \enquote{embellished operators}: -\begin{blockquote} - The precise definition of an \enquote{embellished operator} is: - \begin{itemize} - \item an \xmltag{mo} element; - \item or one of the elements \xmltag{msub}, \xmltag{msup}, \xmltag{msubsup}, \xmltag{munder}, \xmltag{mover}, \xmltag{munderover}, \xmltag{mmultiscripts}, \xmltag{mfrac}, or \xmltag{semantics} (ยง 5.1 Annotation Framework), whose first argument exists and is an embellished operator; - \item or one of the elements \xmltag{mstyle}, \xmltag{mphantom}, or \xmltag{mpadded}, such that an mrow containing the same arguments would be an embellished operator; - \item or an \xmltag{maction} element whose selected sub-expression exists and is an embellished operator; - \item or an \xmltag{mrow} whose arguments consist (in any order) of one embellished operator and zero or more space-like elements. - \end{itemize} -\end{blockquote} -For every embellished operator, MathML calls the \xmltag{mo} element defining the embellished operator the \enquote{core} of the embellished operator. - -\Luamml\ makes this slightly more general: Every expression is represented by a pair of two elements: The expression and it's core. -The core is always a \xmltag{mo}, \xmltag{mi}, or \xmltag{mn}, \texttt{nil} or s special marker for space like elements. - -If and only if the element is a embellished operator the core is a \xmltag{mo} element representing the core of the embellished operator. -The core is a \xmltag{mi} or a \xmltag{mn} element if and only if the element would be an embellished operator with this core if this element where a \xmltag{mo} element. -The core is the special space like marker for space like elements. Otherwise the core is \texttt{nil}. - -\subsection{Translation of math noads} -A math lists can contain the following node types: noad, fence, fraction, radical, accent, style, choice, ins, mark, adjust, boundary, whatsit, penalty, disc, glue, and kern. The \enquote{noads} - -\subsubsection{Translation of kernel noads} -The math noads of this list contain nested kernel noads. So in the first step, we look into how kernel nodes are translated to math nodes. - -\paragraph{\texttt{math_char} kernel noads} -First the family and character value in the \texttt{math_char} are used to lookup the Unicode character value of this \texttt{math_char}. -(For \texttt{unicode-math}, this is usually just the character value. Legacy maths has to be remapped based on the family.) -Then there are two cases: The digits \texttt{0} to \texttt{9} are mapped to \xmltag{mn} elements, everything else becomes a \xmltag{mi} element with \texttt{mathvariant} set to \texttt{normal}. -(The \texttt{mathvariant} value might get suppressed if the character defaults to mathvariant \texttt{normal}.) -In either case, the \texttt{tex:family} attribute is set to the family number if it's not \texttt{0}. - -The core is always set to the expression itself. E.g.\ the \texttt{math_char} kernel noad \verb+\fam3 a+ would become (assuming no remapping for this family) -\begin{verbatim} -{[0] = 'mi', - mathvariant = 'normal', - ["tex:family"] = 3, - "a" -} -\end{verbatim} - -\subsubsection{\texttt{sub_box} kernel noads} -I am open to suggestions how to convert them properly. - -\subsubsection{\texttt{sub_mlist} kernel noads} -The inner list is converted as a \xmltag{mrow} element, with the core being the core of the \xmltag{mrow} element. See the rules for this later. - -\subsubsection{\texttt{delim} kernel noads} -If the \texttt{small_char} is zero, these get converted as space like elements of the form -\begin{verbatim} -{[0] = 'mspace', - width = '1.196pt', -} -\end{verbatim} -where 1.196 is replaced by the current value of \verb+\nulldelimiterspace+ converted to \texttt{bp}. - -Otherwise the same rules as for \texttt{math_char} apply, -except that instead of \texttt{mi} or \xmltag{mn} elements, -\texttt{mo} elements are generated, -\texttt{mathvariant} is never set, -\texttt{stretchy} is set to \texttt{true} if the operator is not on the list of default stretchy operators in the MathML specification -nd \texttt{lspace} and \texttt{rspace} attributes are set to zero. - -\subsubsection{\texttt{acc} kernel noads} -Depending on the surrounding element containing the \texttt{acc} kernel noad, it is either stretchy or not. -If it's stretchy, the same rules as for \texttt{delim} apply, except that \texttt{lspace} and \texttt{rspace} are not set. -Otherwise the \texttt{stretchy} attribute is set to false if the operator is on the list of default stretchy operators. +% \newcommand\Luamml{\pkg{Luamml}} +% \newcommand\luamml{\pkg{luamml}} +% \newcommand\xmltag[1]{\texttt{<#1>}} +% \section{\Luamml's representation of XML and MathML} +% In the following I assume basic familiarity with both Lua\TeX's representation of math noads and MathML. +% +% \subsection{Representation of XML elements} +% In many places, \luamml\ passes around XML elements. Every element is represented by a Lua table. +% Element \texttt 0 must always be present and is a string representing the tag name. +% The positive integer elements of the table represent child elements (either strings for direct text content or nested tables for nested elements). +% All string members which do not start with a colon are attributes, whose value is the result of applying \texttt{tostring} to the field value. +% This implies that these values should almost always be strings, except that the value \texttt 0 (since it never needs a unit) can often be set as a number. +% For example the XML document +% \begin{verbatim} +% +% 0 +% < +% x +% +% \end{verbatim} +% would be represented by the Lua table +% \begin{verbatim} +% {[0] = "math", block="display", +% {[0] = "mn", "0"}, +% {[0] = "mo", "<"}, +% {[0] = "mi", mathvariant="normal", "x"} +% } +% \end{verbatim} +% +% \subsection{Expression cores} +% MathML knows the concept of \enquote{embellished operators}: +% \begin{blockquote} +% The precise definition of an \enquote{embellished operator} is: +% \begin{itemize} +% \item an \xmltag{mo} element; +% \item or one of the elements \xmltag{msub}, \xmltag{msup}, \xmltag{msubsup}, \xmltag{munder}, \xmltag{mover}, \xmltag{munderover}, \xmltag{mmultiscripts}, \xmltag{mfrac}, or \xmltag{semantics} (ยง 5.1 Annotation Framework), whose first argument exists and is an embellished operator; +% \item or one of the elements \xmltag{mstyle}, \xmltag{mphantom}, or \xmltag{mpadded}, such that an mrow containing the same arguments would be an embellished operator; +% \item or an \xmltag{maction} element whose selected sub-expression exists and is an embellished operator; +% \item or an \xmltag{mrow} whose arguments consist (in any order) of one embellished operator and zero or more space-like elements. +% \end{itemize} +% \end{blockquote} +% For every embellished operator, MathML calls the \xmltag{mo} element defining the embellished operator the \enquote{core} of the embellished operator. +% +% \Luamml\ makes this slightly more general: Every expression is represented by a pair of two elements: The expression and it's core. +% The core is always a \xmltag{mo}, \xmltag{mi}, or \xmltag{mn}, \texttt{nil} or s special marker for space like elements. +% +% If and only if the element is a embellished operator the core is a \xmltag{mo} element representing the core of the embellished operator. +% The core is a \xmltag{mi} or a \xmltag{mn} element if and only if the element would be an embellished operator with this core if this element where a \xmltag{mo} element. +% The core is the special space like marker for space like elements. Otherwise the core is \texttt{nil}. +% +% \subsection{Translation of math noads} +% A math lists can contain the following node types: noad, fence, fraction, radical, accent, style, choice, ins, mark, adjust, boundary, whatsit, penalty, disc, glue, and kern. The \enquote{noads} +% +% \subsubsection{Translation of kernel noads} +% The math noads of this list contain nested kernel noads. So in the first step, we look into how kernel nodes are translated to math nodes. +% +% \paragraph{\texttt{math_char} kernel noads} +% First the family and character value in the \texttt{math_char} are used to lookup the Unicode character value of this \texttt{math_char}. +% (For \texttt{unicode-math}, this is usually just the character value. Legacy maths has to be remapped based on the family.) +% Then there are two cases: The digits \texttt{0} to \texttt{9} are mapped to \xmltag{mn} elements, everything else becomes a \xmltag{mi} element with \texttt{mathvariant} set to \texttt{normal}. +% (The \texttt{mathvariant} value might get suppressed if the character defaults to mathvariant \texttt{normal}.) +% In either case, the \texttt{tex:family} attribute is set to the family number if it's not \texttt{0}. +% +% The core is always set to the expression itself. E.g.\ the \texttt{math_char} kernel noad \verb+\fam3 a+ would become (assuming no remapping for this family) +% \begin{verbatim} +% {[0] = 'mi', +% mathvariant = 'normal', +% ["tex:family"] = 3, +% "a" +% } +% \end{verbatim} +% +% \subsubsection{\texttt{sub_box} kernel noads} +% I am open to suggestions how to convert them properly. +% +% \subsubsection{\texttt{sub_mlist} kernel noads} +% The inner list is converted as a \xmltag{mrow} element, with the core being the core of the \xmltag{mrow} element. See the rules for this later. +% +% \subsubsection{\texttt{delim} kernel noads} +% If the \texttt{small_char} is zero, these get converted as space like elements of the form +% \begin{verbatim} +% {[0] = 'mspace', +% width = '1.196pt', +% } +% \end{verbatim} +% where 1.196 is replaced by the current value of \verb+\nulldelimiterspace+ converted to \texttt{bp}. +% +% Otherwise the same rules as for \texttt{math_char} apply, +% except that instead of \texttt{mi} or \xmltag{mn} elements, +% \texttt{mo} elements are generated, +% \texttt{mathvariant} is never set, +% \texttt{stretchy} is set to \texttt{true} if the operator is not on the list of default stretchy operators in the MathML specification +% nd \texttt{lspace} and \texttt{rspace} attributes are set to zero. +% +% \subsubsection{\texttt{acc} kernel noads} +% Depending on the surrounding element containing the \texttt{acc} kernel noad, it is either stretchy or not. +% If it's stretchy, the same rules as for \texttt{delim} apply, except that \texttt{lspace} and \texttt{rspace} are not set. +% Otherwise the \texttt{stretchy} attribute is set to false if the operator is on the list of default stretchy operators. From e5d5ac2efe2f72288dd2ebcf58ae9f0f5858a454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 20 Oct 2024 00:58:08 +0200 Subject: [PATCH 119/206] Unbreak explicitly suppressing MathML conversion of elements --- luamml-tex-annotate.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/luamml-tex-annotate.lua b/luamml-tex-annotate.lua index 4b22374..7e09217 100644 --- a/luamml-tex-annotate.lua +++ b/luamml-tex-annotate.lua @@ -59,10 +59,10 @@ local function annotate() props = {} properties[marked] = props end - if annotation.core then + if annotation.core ~= nil then props.mathml_core = annotation.core end - if annotation.struct then + if annotation.struct ~= nil then local saved = props.mathml_filter local struct = annotation.struct function props.mathml_filter(mml, core) From cfb5d03b9266fc27cf7061dbc29efbd646ff222b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 20 Oct 2024 12:16:10 +0200 Subject: [PATCH 120/206] Fix MathML namespace in structure elements and improve error handling --- luamml-structelemwriter.lua | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index eb266a1..97a90ac 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -13,9 +13,27 @@ local function escape_string(str) return str end +local ltx +local function get_ltx() + if not ltx then + ltx = _ENV.ltx + if not ltx then + tex.error("LaTeX PDF support not loaded", {"Maybe try adding \\DocumentMetadata."}) + ltx = {pdf = {object_id = function() return 0 end}} + end + end + return ltx +end + local mathml_ns_obj local function get_mathml_ns_obj() - mathml_ns_obj = mathml_ns_obj or token.create'c__pdf_backend_object_tag/NS/mathml_int'.index + if not mathml_ns_obj then + mathml_ns_obj = get_ltx().pdf.object_id'tag/NS/mathml' + if not mathml_ns_obj then + tex.error("Failed to find MathML namespace", {"The PDF support does not know the mathml namespace"}) + mathml_ns_obj = 0 + end + end return mathml_ns_obj end From fc430b31ac72d1843c80c158393c7409323d6fce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Sun, 20 Oct 2024 12:21:51 +0200 Subject: [PATCH 121/206] Mark equation labels through intent --- luamml-table.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luamml-table.lua b/luamml-table.lua index 8b70395..4fb553a 100644 --- a/luamml-table.lua +++ b/luamml-table.lua @@ -58,7 +58,7 @@ end local function store_tag(xml) local mml_row = store_get_row() - mml_row[0] = 'mlabeledtr' + xml.intent = ':equationlabel' table.insert(mml_row, 1, xml) last_tag = nil end From 58ad8a5766a43c1864f78f29f62903724b1efa6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 24 Oct 2024 23:45:07 +0200 Subject: [PATCH 122/206] Support \smash and cleanup --- luamml-patches-kernel.sty | 39 ++++++++++++++++++++++++++------------- luamml-tex-annotate.lua | 9 +++++++++ 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index fa3aaae..5575b64 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -1,14 +1,34 @@ \ProvidesExplPackage {luamml-patches-kernel} {2024-08-14} {0.1.0} {Feel free to add a description here} -\cs_new:Npn \__luamml_kernel_phantom:nnn #1#2#3 { +\cs_set:Npn \mathsm@sh #1 #2 { + \setbox \z@ \hbox { + $ + \m@th #1 { + #2 + } + \luamml_flag_save:nNn {mathsmash} #1 {mpadded} + \luamml_pdf_write: + $ + } + \luamml_annotate:nen {2} { + nucleus = true, + core = consume_label('mathsmash', function(padded) + padded.height, padded.depth = 0, 0~ + end), + } { + {} + \finsm@sh + } +} + +\cs_set:Npn \mathph@nt #1 #2 { \setbox \z@ = \hbox { $ \m@th - #2 - {#3} - \luamml_flag_save:nNn {mathphant_#1} #2 {mphantom} - \luamml_pdf_write: + #1 + {#2} + \luamml_flag_save:nNn {mathphant} #1 {mphantom} $ } \luamml_annotate:nen {1} { @@ -20,19 +40,12 @@ \ifv@\else height = 0, depth = 0, \fi - data.mathml.mathphant_#1, + consume_label'mathphant', } } { \finph@nt } } -\cs_generate_variant:Nn \__luamml_kernel_phantom:nnn {V} - -\int_new:N \g__luamml_kernel_phantom_int -\cs_set:Npn \mathph@nt { - \int_gincr:N \g__luamml_kernel_phantom_int - \__luamml_kernel_phantom:Vnn \g__luamml_kernel_phantom_int -} \@ifpackageloaded {unicode-math} {} { \cs_new:Npn \__luamml_kernel_define_character:Nnn #1#2#3 { diff --git a/luamml-tex-annotate.lua b/luamml-tex-annotate.lua index 7e09217..050a00a 100644 --- a/luamml-tex-annotate.lua +++ b/luamml-tex-annotate.lua @@ -6,6 +6,15 @@ local mark_environment = { data = { }, } +do + local _ENV = mark_environment + function consume_label(label, fn) + local mathml = data.mathml[label] + data.mathml[label] = nil + if fn then fn(mathml) end + return mathml + end +end local function annotate() local annotation, err = load( 'return {' From dc2d92e3fd7a749252888311611e7a57c5dafc5c Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sat, 26 Oct 2024 00:45:57 +0200 Subject: [PATCH 123/206] rename commands as discussed --- luamml-demo.sty | 2 +- luamml-patches-amsmath.sty | 30 ++++++++-------- luamml-patches-array.sty | 6 ++-- luamml-patches-kernel.sty | 4 +-- luamml.dtx | 72 ++++++++++++++++++++++++-------------- 5 files changed, 67 insertions(+), 47 deletions(-) diff --git a/luamml-demo.sty b/luamml-demo.sty index 64e4e3f..82bed7f 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -27,7 +27,7 @@ } \DeclareOption{structelem}{ \bool_set_true:N \l__luamml_demo_structelem_bool - \luamml_flag_structelem: + \luamml_structelem: } \DeclareOption{files}{ \int_new:N \g__luamml_demo_mathml_int diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index c0df5ed..d9a47f0 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -42,7 +42,7 @@ \m@th \displaystyle {##} - \luamml_flag_save:nNn {} \displaystyle {mtd} + \luamml_save:nNn {} \displaystyle {mtd} $ \__luamml_amsmath_add_last_to_row: \tabskip \z@skip @@ -54,7 +54,7 @@ {} ## } - \luamml_flag_save:nNn {} \displaystyle {mtd} + \luamml_save:nNn {} \displaystyle {mtd} $ \__luamml_amsmath_add_last_to_row: \hfil @@ -85,7 +85,7 @@ \m@th \displaystyle ## - \luamml_flag_save:nNn {} \displaystyle {mtd} + \luamml_save:nNn {} \displaystyle {mtd} $ \__luamml_amsmath_add_last_to_row: \hfil @@ -122,7 +122,7 @@ \m@th \displaystyle {##} - \luamml_flag_save:nNn {} \displaystyle {mtd} + \luamml_save:nNn {} \displaystyle {mtd} $ } \__luamml_amsmath_add_box_to_row: @@ -153,7 +153,7 @@ \cs_set:Npn \gmeasure@ #1 { \exp_last_unbraced:Nno \use_ii_i:nn - { \luamml_flag_ignore: } + { \luamml_ignore: } { \__luamml_amsmath_original_gmeasure:n {#1} } } @@ -178,9 +178,9 @@ \displaystyle {##} \ifmeasuring@ - \luamml_flag_ignore: + \luamml_ignore: \else - \luamml_flag_save:nNn {} \displaystyle {mtd} + \luamml_save:nNn {} \displaystyle {mtd} \fi $ } @@ -202,9 +202,9 @@ ## } \ifmeasuring@ - \luamml_flag_ignore: + \luamml_ignore: \else - \luamml_flag_save:nNn {} \displaystyle {mtd} + \luamml_save:nNn {} \displaystyle {mtd} \fi $ } @@ -289,7 +289,7 @@ \cs_set:Npn \mmeasure@ #1 { \exp_last_unbraced:Nno \use_ii_i:nn - { \luamml_flag_ignore: } + { \luamml_ignore: } { \__luamml_amsmath_original_mmeasure:n {#1} } } @@ -298,14 +298,14 @@ % Less luckily, \endmultline@math sometimes get overwritten for the last line. % But that isn't a problem since we want special behavior there anyway. \cs_set:Npn \endmultline@math { - \luamml_flag_save:nNn {} \displaystyle {mtd} + \luamml_save:nNn {} \displaystyle {mtd} $ \__luamml_amsmath_add_last_to_row: } \cs_set:Npn \rendmultline@ { \iftag@ - \luamml_flag_save:nNn {} \displaystyle {mtd} + \luamml_save:nNn {} \displaystyle {mtd} $ \__luamml_amsmath_add_last_to_row: \let \endmultline@math \relax @@ -370,7 +370,7 @@ \m@th \scriptstyle ## - \luamml_flag_save:nn {} {mtd} % No \scriptsize here since we want to add the mstyle nodes + \luamml_save:nn {} {mtd} % No \scriptsize here since we want to add the mstyle nodes $ \__luamml_amsmath_add_last_to_row: \hfil @@ -381,7 +381,7 @@ \m@th \scriptstyle ## - \luamml_flag_save:nn {} {mtd} % No \scriptsize here since we want to add the mstyle nodes + \luamml_save:nn {} {mtd} % No \scriptsize here since we want to add the mstyle nodes $ \__luamml_amsmath_add_last_to_row: \hfil @@ -404,7 +404,7 @@ \let \@ifnextchar \new@ifnextchar \left \lbrace \def \arraystretch {1.2} - \array {@{}l@{\quad \luamml_flag_ignore:}l@{}} + \array {@{}l@{\quad \luamml_ignore:}l@{}} } diff --git a/luamml-patches-array.sty b/luamml-patches-array.sty index d0f3821..e4df3d8 100644 --- a/luamml-patches-array.sty +++ b/luamml-patches-array.sty @@ -18,7 +18,7 @@ } { \__luamml_array_init_col: \insert@column - \luamml_flag_save:nn {} {mtd} + \luamml_save:nn {} {mtd} \d@llarend \__luamml_array_finalize_col:w 0~ } @@ -33,7 +33,7 @@ } { \__luamml_array_init_col: \insert@column - \luamml_flag_save:nn {} {mtd} + \luamml_save:nn {} {mtd} \d@llarend \__luamml_array_finalize_col:w 1~ } @@ -49,7 +49,7 @@ } { \__luamml_array_init_col: \insert@column - \luamml_flag_save:nn {} {mtd} + \luamml_save:nn {} {mtd} \d@llarend \__luamml_array_finalize_col:w 2~ } diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index 5575b64..bc920ac 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -7,7 +7,7 @@ \m@th #1 { #2 } - \luamml_flag_save:nNn {mathsmash} #1 {mpadded} + \luamml_save:nNn {mathsmash} #1 {mpadded} \luamml_pdf_write: $ } @@ -28,7 +28,7 @@ \m@th #1 {#2} - \luamml_flag_save:nNn {mathphant} #1 {mphantom} + \luamml_save:nNn {mathphant} #1 {mphantom} $ } \luamml_annotate:nen {1} { diff --git a/luamml.dtx b/luamml.dtx index 7815ac5..6ba4722 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -170,17 +170,21 @@ % The most important interface is for setting the flag which controls how the % formulas should be converted. % -% \begin{macro}{\luamml_flag_process:} +% \begin{macro}{\luamml_process:} % Consider the current formula to be a complete, free-standing mathematical % expression which should be converted to MathML. Additionally, the formula % is also saved in the \texttt{start\_math} node as with -% \cs{luamml_flag_save:}. +% \cs{luamml_save:}. % \begin{macrocode} -\cs_new_protected:Npn \luamml_flag_process: { +\cs_new_protected:Npn \luamml_process: { \tl_set:Nn \l__luamml_label_tl {} \int_set:Nn \l__luamml_flag_int { 3 } } % \end{macrocode} +% Temporarly for compatibility +% \begin{macrocode} +\cs_set_eq:NN \luamml_flag_process: \luamml_process: +% \end{macrocode} % \end{macro} % % \begin{macro}{\__luamml_maybe_structelem:} @@ -194,6 +198,7 @@ } {2} ) + } +% \end{macrocode} % \end{macro} % % \begin{macro}{\__luamml_style_to_num:N} @@ -215,61 +220,76 @@ % \end{macro} % % -% \begin{macro}{\luamml_flag_save:n, -% \luamml_flag_save:nN, -% \luamml_flag_save:nn, -% \luamml_flag_save:nNn} +% \begin{macro}{\luamml_save:n, +% \luamml_save:nN, +% \luamml_save:nn, +% \luamml_save:nNn} % Convert the current formula but only save it's representation in the math % node without emitting it as a complete formula. This is useful when the -% expression forms part of a bigger formula and will be intergrated into it's +% expression forms part of a bigger formula and will be integrated into it's % MathML tables later by special code. -% It optinally accepts three parameters: A label, one math style command +% It optionally accepts three parameters: A label, one math style command % (\cs{displaystyle}, \cs{textstyle}, etc.) which is the implicit math style % (so the style which the surrounding code expects this style to have) and a % name for the root element (defaults to \texttt{mrow}). % If the root element name is \texttt{mrow}, it will get suppressed in some % cases. % \begin{macrocode} -\cs_new_protected:Npn \luamml_flag_save:n #1 { +\cs_new_protected:Npn \luamml_save:n #1 { \tl_set:Nn \l__luamml_label_tl {#1} \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 1 } } -\cs_new_protected:Npn \luamml_flag_save:nN #1#2 { +\cs_new_protected:Npn \luamml_save:nN #1#2 { \tl_set:Nn \l__luamml_label_tl {#1} \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 17 + \__luamml_style_to_num:N #2 } } -\cs_new_protected:Npn \luamml_flag_save:nn #1 { +\cs_new_protected:Npn \luamml_save:nn #1 { \tl_set:Nn \l__luamml_label_tl {#1} \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 5 } \tl_set:Nn \l__luamml_root_tl } -\cs_new_protected:Npn \luamml_flag_save:nNn #1#2 { +\cs_new_protected:Npn \luamml_save:nNn #1#2 { \tl_set:Nn \l__luamml_label_tl {#1} \int_set:Nn \l__luamml_flag_int { \__luamml_maybe_structelem: 21 + \__luamml_style_to_num:N #2 } \tl_set:Nn \l__luamml_root_tl } % \end{macrocode} -% \end{macro} -% -% \begin{macro}{\luamml_flag_ignore:} -% Completely ignore the math mode material. +% Temporarly for compatibility % \begin{macrocode} -\cs_new_protected:Npn \luamml_flag_ignore: { - \int_set:Nn \l__luamml_flag_int { 0 } -} +\cs_set_eq:NN \luamml_flag_save:n \luamml_save:n +\cs_set_eq:NN \luamml_flag_save:nN \luamml_save:nN +\cs_set_eq:NN \luamml_flag_save:nn \luamml_save:nn +\cs_set_eq:NN \luamml_flag_save:nNn \luamml_save:nNn % \end{macrocode} % \end{macro} % -% \begin{macro}{\luamml_flag_structelem:} -% Like \cs{luamml_flag_process:}, but additionally add PDF structure +% \begin{macro}{\luamml_ignore:} +% Completely ignore the math mode material. +% \begin{macrocode} +\cs_new_protected:Npn \luamml_ignore: { + \int_set:Nn \l__luamml_flag_int { 0 } +} +% \end{macrocode} +% Temporarly for compatibility +% \begin{macrocode} +\cs_set_eq:NN \luamml_flag_ignore: \luamml_ignore: +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\luamml_structelem:} +% Like \cs{luamml_process:}, but additionally adds PDF structure % elements. This only works in Lua\TeX\ and requires that the \pkg{tagpdf} package % has been loaded \emph{before} \texttt{luamml}. % \begin{macrocode} %<*luatex> -\cs_new_protected:Npn \luamml_flag_structelem: { +\cs_new_protected:Npn \luamml_structelem: { \tl_set:Nn \l__luamml_label_tl {} \int_set:Nn \l__luamml_flag_int { 11 } } +% \end{macrocode} +% Temporarly for compatibility +% \begin{macrocode} +\cs_set_eq:NN \luamml_flag_structelem: \luamml_structelem: % % \end{macrocode} % \end{macro} @@ -282,7 +302,7 @@ % The value is fully expanded when the file is written. % % Only complete formulas get written into files (so formulas where -% \cs{luamml_flag_process:} or \cs{luamml_flag_structelem:} are in effect). +% \cs{luamml_process:} or \cs{luamml_structelem:} are in effect). % % Only implemented in Lua\TeX, in pdf\TeX\ the arguments for \texttt{pdfmml} % determine the output location. @@ -304,7 +324,7 @@ % % By default, the flag is set to assume complete formulas. % \begin{macrocode} -\luamml_flag_process: +\luamml_process: % \end{macrocode} % % \subsection{Annotations} @@ -321,7 +341,7 @@ % let Lua\TeX determine the number itself. % % Passing the first parameter explicitly is useful for any annotations which -% should be compatible with fututre pdf\TeX versions of this functionality. +% should be compatible with future pdf\TeX versions of this functionality. % \begin{macrocode} \cs_new_protected:Npn \luamml_annotate:nen #1#2#3 { \__luamml_annotate_begin: From f71c7b3c67ce1d9ddfb6a4bfb3e4217b473c4e8a Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sat, 26 Oct 2024 01:02:33 +0200 Subject: [PATCH 124/206] add mathtools patch, latex3/tagging-project#734 --- luamml-patches-mathtools.sty | 35 +++++++++++++++++++++++++++++++++++ luamml.dtx | 1 + 2 files changed, 36 insertions(+) create mode 100644 luamml-patches-mathtools.sty diff --git a/luamml-patches-mathtools.sty b/luamml-patches-mathtools.sty new file mode 100644 index 0000000..f73ced8 --- /dev/null +++ b/luamml-patches-mathtools.sty @@ -0,0 +1,35 @@ +\ProvidesExplPackage {luamml-patches-mathtools} {2024-10-26} {0.1.0} + {Feel free to add a description here} + +\RequirePackage{luamml-patches-amsmath} +% see https://github.com/latex3/tagging-project/issues/734 +\renewcommand*\MT_mult_internal:n [1]{ + \MH_if_boolean:nF {outer_mult}{\alignedspace@left} %<-- requires amsmath 2016/11/05 + \MT_next: + \bgroup + \Let@ + \def\l_MT_multline_lastline_fint{0 } + \chardef\dspbrk@context\@ne \restore@math@cr + \MH_let:NwN \math@cr@@\MT_mult_mathcr_atat:w + \MH_let:NwN \shoveleft\MT_shoveleft:wn + \MH_let:NwN \shoveright\MT_shoveright:wn + \spread@equation + \MH_set_boolean_F:n {mult_firstline} + \MT_measure_mult:n {#1} + \MH_if_dim:w \l_MT_multwidth_dim<\l_MT_multline_measure_fdim + \MH_setlength:dn \l_MT_multwidth_dim{\l_MT_multline_measure_fdim} + \fi + \MH_set_boolean_T:n {mult_firstline} + \MH_if_num:w \l_MT_multline_lastline_fint=\@ne + \MH_let:NwN \math@cr@@ \MT_mult_firstandlast_mathcr:w + \MH_fi: + \ialign\bgroup + \hfil\strut@$\m@th\displaystyle{}## + \luamml_save:nNn {} \displaystyle {mtd} + $ + \__luamml_amsmath_add_last_to_row: + \hfil + \crcr + \hfilneg + #1 +} diff --git a/luamml.dtx b/luamml.dtx index 6ba4722..e45295b 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -540,6 +540,7 @@ %<*luatex> \__luamml_patch_package:n {amstext} \__luamml_patch_package:n {amsmath} +\__luamml_patch_package:n {mathtools} \__luamml_patch_package:n {array} % % \end{macrocode} From 17d7ebd16b96ce5544269cbebabf50f5fe642a91 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Mon, 28 Oct 2024 12:01:05 +0100 Subject: [PATCH 125/206] use \DocumentMetadata --- testfiles-lua/cases.mlt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testfiles-lua/cases.mlt b/testfiles-lua/cases.mlt index 68f8414..3db10ea 100644 --- a/testfiles-lua/cases.mlt +++ b/testfiles-lua/cases.mlt @@ -1,4 +1,4 @@ -\DeclareDocumentMetadata{ +\DocumentMetadata{ uncompress, pdfversion = 2.0, testphase = phase-I, From 3b6955314f3af91ad726e0de24af3030dbf51ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 29 Oct 2024 06:10:05 +0100 Subject: [PATCH 126/206] Test file adjustments --- testfiles-lua/test_struct.pvt | 2 +- testfiles-lua/test_struct.tpf | 898 +++++++++++++++++----------------- testfiles-lua/test_xml.mlr | 18 +- 3 files changed, 464 insertions(+), 454 deletions(-) diff --git a/testfiles-lua/test_struct.pvt b/testfiles-lua/test_struct.pvt index bd2e507..c1a0f8c 100644 --- a/testfiles-lua/test_struct.pvt +++ b/testfiles-lua/test_struct.pvt @@ -1,5 +1,5 @@ \ExplSyntaxOn -\sys_gset_rand_seed:n{1000} +\sys_gset_rand_seed:n{42} \ExplSyntaxOff \DocumentMetadata{ uncompress, diff --git a/testfiles-lua/test_struct.tpf b/testfiles-lua/test_struct.tpf index 6cb2135..c895313 100644 --- a/testfiles-lua/test_struct.tpf +++ b/testfiles-lua/test_struct.tpf @@ -1,25 +1,25 @@ %PDF-2.0 %ฬีมิลุะฤฦ 49 0 obj -<< /O/NSO/NS 0 0 R/displaystyle(true)/scriptlevel(0) >> +<< /O/NSO/NS 13 0 R/displaystyle(true)/scriptlevel(0) >> endobj 52 0 obj -<< /O/NSO/NS 0 0 R/lspace(0.278em)/rspace(0.278em) >> +<< /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0.278em) >> endobj 80 0 obj -<< /O/NSO/NS 0 0 R/display(block) >> +<< /O/NSO/NS 13 0 R/display(block) >> endobj 83 0 obj -<< /O/NSO/NS 0 0 R/fence(true)/lspace(0)/rspace(0)/symmetric(true) >> +<< /O/NSO/NS 13 0 R/fence(true)/lspace(0)/rspace(0)/symmetric(true) >> endobj 85 0 obj -<< /O/NSO/NS 0 0 R/width(-4.981pt) >> +<< /O/NSO/NS 13 0 R/width(-4.981pt) >> endobj 87 0 obj -<< /O/NSO/NS 0 0 R/lspace(+4.981pt)/width(+9.963pt) >> +<< /O/NSO/NS 13 0 R/lspace(+4.981pt)/width(+9.963pt) >> endobj 102 0 obj -<< /O/NSO/NS 0 0 R/width(1.196pt) >> +<< /O/NSO/NS 13 0 R/width(1.196pt) >> endobj 103 0 obj < /EF<> >> endobj 112 0 obj -<< /O/NSO/NS 0 0 R/lspace(0)/rspace(0.222em) >> +<< /O/NSO/NS 13 0 R/lspace(0)/rspace(0.222em) >> endobj 115 0 obj -<< /O/NSO/NS 0 0 R/lspace(0.222em)/rspace(0.222em) >> +<< /O/NSO/NS 13 0 R/lspace(0.222em)/rspace(0.222em) >> endobj 129 0 obj -<< /O/NSO/NS 0 0 R/lspace(0)/rspace(0) >> +<< /O/NSO/NS 13 0 R/lspace(0)/rspace(0) >> endobj 130 0 obj < /EF<> >> endobj 136 0 obj -<< /O/NSO/NS 0 0 R/lspace(0)/movablelimits(true)/rspace(0.167em) >> +<< /O/NSO/NS 13 0 R/lspace(0)/movablelimits(true)/rspace(0.167em) >> endobj 144 0 obj -<< /O/NSO/NS 0 0 R/stretchy(true) >> +<< /O/NSO/NS 13 0 R/stretchy(true) >> endobj 148 0 obj -<< /O/NSO/NS 0 0 R/mathvariant(normal) >> +<< /O/NSO/NS 13 0 R/mathvariant(normal) >> endobj 149 0 obj < /EF<> >> endobj 171 0 obj -<< /O/NSO/NS 0 0 R/lspace(0.278em)/rspace(0) >> +<< /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0) >> endobj 176 0 obj -<< /O/NSO/NS 0 0 R/fence(true)/lspace(0)/maxsize(17.861pt)/minsize(17.861pt)/rspace(0)/symmetric(true) >> +<< /O/NSO/NS 13 0 R/fence(true)/lspace(0)/maxsize(17.861pt)/minsize(17.861pt)/rspace(0)/symmetric(true) >> endobj 199 0 obj -<< /O/NSO/NS 0 0 R/columnalign(right left right left)/columnspacing(0 .8em 0)/displaystyle(true) >> +<< /O/NSO/NS 13 0 R/columnalign(right left right left)/columnspacing(0 .8em 0)/displaystyle(true) >> endobj -209 0 obj +202 0 obj +<< /O/NSO/NS 13 0 R/intent(:equationlabel) >> +endobj +210 0 obj <> + /Length 1155 >> stream -(1)๐‘Ž๐‘๐‘=๐‘‘๐‘’๐‘“๐‘’i๐œ‹=โˆ’1(2)(1+2=3)(3)5 +(1)๐‘Ž๐‘๐‘=๐‘‘๐‘’๐‘“๐‘’i๐œ‹=โˆ’1(2)(1+2=3)(3)5 endstream endobj 150 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> +<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> endobj -215 0 obj -<< /O/NSO/NS 0 0 R/lspace(0)/rspace(0)/stretchy(false) >> +216 0 obj +<< /O/NSO/NS 13 0 R/lspace(0)/rspace(0)/stretchy(false) >> endobj -228 0 obj +229 0 obj <> stream sin(๐‘ฅ)โˆ’sin(๐‘ฅ+2๐œ‹)=0 endstream endobj -210 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> +211 0 obj +<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> endobj -229 0 obj -<< /Type /Metadata /Subtype /XML /Length 11362 >> +230 0 obj +<< /Type /Metadata /Subtype /XML /Length 11693 >> stream @@ -156,6 +159,12 @@ stream internal Year of standard + + rev + Integer + internal + Revision year of standard + @@ -329,7 +338,7 @@ stream endstream endobj -232 0 obj +233 0 obj << /Length 7848 >> stream /opacity1 gs @@ -898,36 +907,36 @@ EMC EMC endstream endobj -231 0 obj -<< /Type /Page /Contents 232 0 R /Resources 230 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 237 0 R >> +232 0 obj +<< /Type /Page /Contents 233 0 R /Resources 231 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 238 0 R >> endobj -230 0 obj -<< /ExtGState 1 0 R /Font << /F15 233 0 R /F20 234 0 R /F21 235 0 R /F32 236 0 R >> >> +231 0 obj +<< /ExtGState 1 0 R /Font << /F15 234 0 R /F20 235 0 R /F21 236 0 R /F32 237 0 R >> >> endobj 1 0 obj << /opacity1 <> >> endobj -238 0 obj +239 0 obj << /Marked true >> endobj 6 0 obj -<< /Nums [0 [ 23 0 R 82 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 41 0 R 43 0 R 93 0 R 94 0 R 96 0 R 45 0 R 54 0 R 56 0 R 57 0 R 58 0 R 72 0 R 74 0 R 107 0 R 108 0 R 111 0 R 113 0 R 114 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 126 0 R 127 0 R 128 0 R 135 0 R 137 0 R 139 0 R 143 0 R 142 0 R 146 0 R 147 0 R 153 0 R 154 0 R 155 0 R 158 0 R 159 0 R 160 0 R 161 0 R 164 0 R 166 0 R 167 0 R 170 0 R 172 0 R 173 0 R 175 0 R 177 0 R 178 0 R 179 0 R 182 0 R 183 0 R 184 0 R 190 0 R 213 0 R 214 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R] +<< /Nums [0 [ 23 0 R 82 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 41 0 R 43 0 R 93 0 R 94 0 R 96 0 R 45 0 R 54 0 R 56 0 R 57 0 R 58 0 R 72 0 R 74 0 R 107 0 R 108 0 R 111 0 R 113 0 R 114 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 126 0 R 127 0 R 128 0 R 135 0 R 137 0 R 139 0 R 143 0 R 142 0 R 146 0 R 147 0 R 153 0 R 154 0 R 155 0 R 158 0 R 159 0 R 160 0 R 161 0 R 164 0 R 166 0 R 167 0 R 170 0 R 172 0 R 173 0 R 175 0 R 177 0 R 178 0 R 179 0 R 182 0 R 183 0 R 184 0 R 190 0 R 214 0 R 215 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R] ] >> endobj -239 0 obj +240 0 obj << /Limits [(ID.0002) (ID.0051)]/Names [(ID.0002) 21 0 R (ID.0003) 22 0 R (ID.0004) 23 0 R (ID.0005) 25 0 R (ID.0006) 26 0 R (ID.0007) 27 0 R (ID.0008) 28 0 R (ID.0009) 29 0 R (ID.0010) 30 0 R (ID.0011) 31 0 R (ID.0012) 32 0 R (ID.0013) 33 0 R (ID.0014) 34 0 R (ID.0015) 35 0 R (ID.0016) 36 0 R (ID.0017) 37 0 R (ID.0018) 38 0 R (ID.0019) 39 0 R (ID.0020) 40 0 R (ID.0021) 41 0 R (ID.0022) 42 0 R (ID.0023) 43 0 R (ID.0024) 44 0 R (ID.0025) 45 0 R (ID.0026) 46 0 R (ID.0027) 47 0 R (ID.0028) 48 0 R (ID.0029) 50 0 R (ID.0030) 51 0 R (ID.0031) 53 0 R (ID.0032) 54 0 R (ID.0033) 55 0 R (ID.0034) 56 0 R (ID.0035) 57 0 R (ID.0036) 58 0 R (ID.0037) 59 0 R (ID.0038) 60 0 R (ID.0039) 61 0 R (ID.0040) 62 0 R (ID.0041) 63 0 R (ID.0042) 64 0 R (ID.0043) 65 0 R (ID.0044) 66 0 R (ID.0045) 67 0 R (ID.0046) 68 0 R (ID.0047) 69 0 R (ID.0048) 70 0 R (ID.0049) 71 0 R (ID.0050) 72 0 R (ID.0051) 73 0 R ] >> endobj -240 0 obj +241 0 obj << /Limits [(ID.0052) (ID.0101)]/Names [(ID.0052) 74 0 R (ID.0053) 75 0 R (ID.0054) 76 0 R (ID.0055) 77 0 R (ID.0056) 78 0 R (ID.0057) 79 0 R (ID.0058) 81 0 R (ID.0059) 82 0 R (ID.0060) 84 0 R (ID.0061) 86 0 R (ID.0062) 88 0 R (ID.0063) 89 0 R (ID.0064) 90 0 R (ID.0065) 91 0 R (ID.0066) 92 0 R (ID.0067) 93 0 R (ID.0068) 94 0 R (ID.0069) 95 0 R (ID.0070) 96 0 R (ID.0071) 97 0 R (ID.0072) 98 0 R (ID.0073) 99 0 R (ID.0074) 100 0 R (ID.0075) 101 0 R (ID.0076) 105 0 R (ID.0077) 106 0 R (ID.0078) 107 0 R (ID.0079) 108 0 R (ID.0080) 109 0 R (ID.0081) 110 0 R (ID.0082) 111 0 R (ID.0083) 113 0 R (ID.0084) 114 0 R (ID.0085) 116 0 R (ID.0086) 117 0 R (ID.0087) 118 0 R (ID.0088) 119 0 R (ID.0089) 120 0 R (ID.0090) 121 0 R (ID.0091) 122 0 R (ID.0092) 123 0 R (ID.0093) 124 0 R (ID.0094) 125 0 R (ID.0095) 126 0 R (ID.0096) 127 0 R (ID.0097) 128 0 R (ID.0098) 132 0 R (ID.0099) 133 0 R (ID.0100) 134 0 R (ID.0101) 135 0 R ] >> endobj -241 0 obj +242 0 obj << /Limits [(ID.0102) (ID.0151)]/Names [(ID.0102) 137 0 R (ID.0103) 138 0 R (ID.0104) 139 0 R (ID.0105) 140 0 R (ID.0106) 141 0 R (ID.0107) 142 0 R (ID.0108) 143 0 R (ID.0109) 145 0 R (ID.0110) 146 0 R (ID.0111) 147 0 R (ID.0112) 151 0 R (ID.0113) 152 0 R (ID.0114) 153 0 R (ID.0115) 154 0 R (ID.0116) 155 0 R (ID.0117) 156 0 R (ID.0118) 157 0 R (ID.0119) 158 0 R (ID.0120) 159 0 R (ID.0121) 160 0 R (ID.0122) 161 0 R (ID.0123) 162 0 R (ID.0124) 163 0 R (ID.0125) 164 0 R (ID.0126) 165 0 R (ID.0127) 166 0 R (ID.0128) 167 0 R (ID.0129) 168 0 R (ID.0130) 169 0 R (ID.0131) 170 0 R (ID.0132) 172 0 R (ID.0133) 173 0 R (ID.0134) 174 0 R (ID.0135) 175 0 R (ID.0136) 177 0 R (ID.0137) 178 0 R (ID.0138) 179 0 R (ID.0139) 180 0 R (ID.0140) 181 0 R (ID.0141) 182 0 R (ID.0142) 183 0 R (ID.0143) 184 0 R (ID.0144) 185 0 R (ID.0145) 186 0 R (ID.0146) 187 0 R (ID.0147) 188 0 R (ID.0148) 189 0 R (ID.0149) 190 0 R (ID.0150) 191 0 R (ID.0151) 192 0 R ] >> endobj -242 0 obj -<< /Limits [(ID.0152) (ID.0182)]/Names [(ID.0152) 193 0 R (ID.0153) 194 0 R (ID.0154) 195 0 R (ID.0155) 196 0 R (ID.0156) 197 0 R (ID.0157) 198 0 R (ID.0158) 200 0 R (ID.0159) 201 0 R (ID.0160) 202 0 R (ID.0161) 203 0 R (ID.0162) 204 0 R (ID.0163) 205 0 R (ID.0164) 206 0 R (ID.0165) 207 0 R (ID.0166) 208 0 R (ID.0167) 211 0 R (ID.0168) 212 0 R (ID.0169) 213 0 R (ID.0170) 214 0 R (ID.0171) 216 0 R (ID.0172) 217 0 R (ID.0173) 218 0 R (ID.0174) 219 0 R (ID.0175) 220 0 R (ID.0176) 221 0 R (ID.0177) 222 0 R (ID.0178) 223 0 R (ID.0179) 224 0 R (ID.0180) 225 0 R (ID.0181) 226 0 R (ID.0182) 227 0 R ] >> -endobj 243 0 obj -<< /Kids [239 0 R 240 0 R 241 0 R 242 0 R] >> +<< /Limits [(ID.0152) (ID.0182)]/Names [(ID.0152) 193 0 R (ID.0153) 194 0 R (ID.0154) 195 0 R (ID.0155) 196 0 R (ID.0156) 197 0 R (ID.0157) 198 0 R (ID.0158) 200 0 R (ID.0159) 201 0 R (ID.0160) 203 0 R (ID.0161) 204 0 R (ID.0162) 205 0 R (ID.0163) 206 0 R (ID.0164) 207 0 R (ID.0165) 208 0 R (ID.0166) 209 0 R (ID.0167) 212 0 R (ID.0168) 213 0 R (ID.0169) 214 0 R (ID.0170) 215 0 R (ID.0171) 217 0 R (ID.0172) 218 0 R (ID.0173) 219 0 R (ID.0174) 220 0 R (ID.0175) 221 0 R (ID.0176) 222 0 R (ID.0177) 223 0 R (ID.0178) 224 0 R (ID.0179) 225 0 R (ID.0180) 226 0 R (ID.0181) 227 0 R (ID.0182) 228 0 R ] >> +endobj +244 0 obj +<< /Kids [240 0 R 241 0 R 242 0 R 243 0 R] >> endobj 7 0 obj << /Artifact /NonStruct /DocumentFragment /Art /Aside /Note /H7 /H6 /H8 /H6 /H9 /H6 /H10 /H6 /Title /P /FENote /Note /Sub /Span /Em /Span /Strong /Span /title /P /part /P /section /H1 /subsection /H2 /subsubsection /H3 /paragraph /H4 /subparagraph /H5 /list /L /itemize /L /enumerate /L /description /L /quote /BlockQuote /quotation /BlockQuote /verbatim /P /item /LI /itemlabel /Lbl /itembody /LBody /footnote /Note /footnotemark /Lbl /footnotelabel /Lbl /text-unit /Part /text /P /theorem-like /Sect /codeline /Span /float /Note /figures /Sect /tables /Sect >> @@ -954,7 +963,7 @@ endobj << /Type /Namespace /NS (https://www.latex-project.org/ns/book/2022) /RoleMapNS 18 0 R >> endobj 19 0 obj -<< /Type /Namespace /NS (data:,A63761E-9D7-4FBB-9B27-C3BC8D9BFB06) >> +<< /Type /Namespace /NS (data:,C9B55C18-275C-494E-C10F-E4B83CD03F23) >> endobj 8 0 obj [ 9 0 R 11 0 R 13 0 R 15 0 R 17 0 R 19 0 R ] @@ -963,10 +972,10 @@ endobj << /Type /StructElem /S /Document /NS 11 0 R /P 5 0 R /K 22 0 R /ID (ID.0002) >> endobj 22 0 obj -<< /Type /StructElem /S /Document /NS 11 0 R /P 21 0 R /K [23 0 R 25 0 R 105 0 R 132 0 R 151 0 R 211 0 R] /ID (ID.0003) >> +<< /Type /StructElem /S /Document /NS 11 0 R /P 21 0 R /K [23 0 R 25 0 R 105 0 R 132 0 R 151 0 R 212 0 R] /ID (ID.0003) >> endobj 23 0 obj -<< /Type /StructElem /S /P /NS 11 0 R /P 22 0 R /K <> /ID (ID.0004) >> +<< /Type /StructElem /S /P /NS 11 0 R /P 22 0 R /K <> /ID (ID.0004) >> endobj 25 0 obj << /Type /StructElem /AF [24 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 79 0 R /ID (ID.0005) >> @@ -975,61 +984,61 @@ endobj << /Type /StructElem /S /mtd /NS 13 0 R /P 89 0 R /K 27 0 R /ID (ID.0006) >> endobj 27 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 26 0 R /K <> /ID (ID.0007) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 26 0 R /K <> /ID (ID.0007) >> endobj 28 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 89 0 R /K 29 0 R /ID (ID.0008) >> endobj 29 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 28 0 R /K <> /ID (ID.0009) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 28 0 R /K <> /ID (ID.0009) >> endobj 30 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 89 0 R /K 31 0 R /ID (ID.0010) >> endobj 31 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 30 0 R /K <> /ID (ID.0011) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 30 0 R /K <> /ID (ID.0011) >> endobj 32 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 90 0 R /K 33 0 R /ID (ID.0012) >> endobj 33 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 32 0 R /K <> /ID (ID.0013) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 32 0 R /K <> /ID (ID.0013) >> endobj 34 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 90 0 R /K 35 0 R /ID (ID.0014) >> endobj 35 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 34 0 R /K <> /ID (ID.0015) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 34 0 R /K <> /ID (ID.0015) >> endobj 36 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 90 0 R /K 37 0 R /ID (ID.0016) >> endobj 37 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 36 0 R /K <> /ID (ID.0017) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 36 0 R /K <> /ID (ID.0017) >> endobj 38 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 39 0 R /ID (ID.0018) >> endobj 39 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 38 0 R /K <> /ID (ID.0019) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 38 0 R /K <> /ID (ID.0019) >> endobj 40 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 41 0 R /ID (ID.0020) >> endobj 41 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 40 0 R /K <> /ID (ID.0021) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 40 0 R /K <> /ID (ID.0021) >> endobj 42 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 43 0 R /ID (ID.0022) >> endobj 43 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 42 0 R /K <> /ID (ID.0023) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 42 0 R /K <> /ID (ID.0023) >> endobj 44 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 99 0 R /K 45 0 R /ID (ID.0024) >> endobj 45 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 44 0 R /K <> /ID (ID.0025) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 44 0 R /K <> /ID (ID.0025) >> endobj 46 0 obj << /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /K [ 47 0 R] /ID (ID.0026) >> @@ -1050,19 +1059,19 @@ endobj << /Type /StructElem /S /mi /NS 13 0 R /P 48 0 R /ID (ID.0031) >> endobj 54 0 obj -<< /Type /StructElem /S /mtext /NS 13 0 R /P 69 0 R /K [<> 55 0 R] /ID (ID.0032) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 69 0 R /K [<> 55 0 R] /ID (ID.0032) >> endobj 55 0 obj << /Type /StructElem /S /math /NS 13 0 R /P 54 0 R /K [56 0 R 57 0 R 58 0 R] /ID (ID.0033) >> endobj 56 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 55 0 R /K <> /ID (ID.0034) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 55 0 R /K <> /ID (ID.0034) >> endobj 57 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 55 0 R /K <> /ID (ID.0035) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 55 0 R /K <> /ID (ID.0035) >> endobj 58 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 55 0 R /K <> /ID (ID.0036) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 55 0 R /K <> /ID (ID.0036) >> endobj 59 0 obj << /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /K [ 60 0 R] /ID (ID.0037) >> @@ -1104,13 +1113,13 @@ endobj << /Type /StructElem /S /mtd /NS 13 0 R /P 100 0 R /K 72 0 R /ID (ID.0049) >> endobj 72 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 71 0 R /K <> /ID (ID.0050) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 71 0 R /K <> /ID (ID.0050) >> endobj 73 0 obj << /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /ID (ID.0051) >> endobj 74 0 obj -<< /Type /StructElem /S /mtext /NS 13 0 R /P 77 0 R /K <> /ID (ID.0052) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 77 0 R /K <> /ID (ID.0052) >> endobj 75 0 obj << /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /ID (ID.0053) >> @@ -1131,7 +1140,7 @@ endobj << /Type /StructElem /S /mrow /NS 13 0 R /P 79 0 R /K [82 0 R 84 0 R 86 0 R 92 0 R 93 0 R] /ID (ID.0058) >> endobj 82 0 obj -<< /Type /StructElem /A 83 0 R /ActualText /S /mo /NS 13 0 R /P 81 0 R /K <> /ID (ID.0059) >> +<< /Type /StructElem /A 83 0 R /ActualText /S /mo /NS 13 0 R /P 81 0 R /K <> /ID (ID.0059) >> endobj 84 0 obj << /Type /StructElem /A 85 0 R /S /mspace /NS 13 0 R /P 81 0 R /ID (ID.0060) >> @@ -1155,16 +1164,16 @@ endobj << /Type /StructElem /A 85 0 R /S /mspace /NS 13 0 R /P 81 0 R /ID (ID.0066) >> endobj 93 0 obj -<< /Type /StructElem /A 83 0 R /ActualText /S /mo /NS 13 0 R /P 81 0 R /K <> /ID (ID.0067) >> +<< /Type /StructElem /A 83 0 R /ActualText /S /mo /NS 13 0 R /P 81 0 R /K <> /ID (ID.0067) >> endobj 94 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 79 0 R /K <> /ID (ID.0068) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 79 0 R /K <> /ID (ID.0068) >> endobj 95 0 obj << /Type /StructElem /S /mrow /NS 13 0 R /P 79 0 R /K [96 0 R 97 0 R 101 0 R] /ID (ID.0069) >> endobj 96 0 obj -<< /Type /StructElem /A 83 0 R /ActualText /S /mo /NS 13 0 R /P 95 0 R /K <> /ID (ID.0070) >> +<< /Type /StructElem /A 83 0 R /ActualText /S /mo /NS 13 0 R /P 95 0 R /K <> /ID (ID.0070) >> endobj 97 0 obj << /Type /StructElem /A 87 0 R /S /mpadded /NS 13 0 R /P 95 0 R /K 98 0 R /ID (ID.0071) >> @@ -1188,10 +1197,10 @@ endobj << /Type /StructElem /A 80 0 R /S /math /NS 13 0 R /P 105 0 R /K [107 0 R 108 0 R 109 0 R 128 0 R] /ID (ID.0077) >> endobj 107 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 106 0 R /K <> /ID (ID.0078) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 106 0 R /K <> /ID (ID.0078) >> endobj 108 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 106 0 R /K <> /ID (ID.0079) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 106 0 R /K <> /ID (ID.0079) >> endobj 109 0 obj << /Type /StructElem /S /mfrac /NS 13 0 R /P 106 0 R /K [110 0 R 125 0 R] /ID (ID.0080) >> @@ -1200,13 +1209,13 @@ endobj << /Type /StructElem /S /mrow /NS 13 0 R /P 109 0 R /K [111 0 R 113 0 R 114 0 R 116 0 R] /ID (ID.0081) >> endobj 111 0 obj -<< /Type /StructElem /A 112 0 R /S /mo /NS 13 0 R /P 110 0 R /K <> /ID (ID.0082) >> +<< /Type /StructElem /A 112 0 R /S /mo /NS 13 0 R /P 110 0 R /K <> /ID (ID.0082) >> endobj 113 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 110 0 R /K <> /ID (ID.0083) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 110 0 R /K <> /ID (ID.0083) >> endobj 114 0 obj -<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 110 0 R /K <> /ID (ID.0084) >> +<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 110 0 R /K <> /ID (ID.0084) >> endobj 116 0 obj << /Type /StructElem /S /msqrt /NS 13 0 R /P 110 0 R /K 117 0 R /ID (ID.0085) >> @@ -1218,34 +1227,34 @@ endobj << /Type /StructElem /S /msup /NS 13 0 R /P 117 0 R /K [119 0 R 120 0 R] /ID (ID.0087) >> endobj 119 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 118 0 R /K <> /ID (ID.0088) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 118 0 R /K <> /ID (ID.0088) >> endobj 120 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 118 0 R /K <> /ID (ID.0089) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 118 0 R /K <> /ID (ID.0089) >> endobj 121 0 obj -<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 117 0 R /K <> /ID (ID.0090) >> +<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 117 0 R /K <> /ID (ID.0090) >> endobj 122 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 117 0 R /K <> /ID (ID.0091) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 117 0 R /K <> /ID (ID.0091) >> endobj 123 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 117 0 R /K <> /ID (ID.0092) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 117 0 R /K <> /ID (ID.0092) >> endobj 124 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 117 0 R /K <> /ID (ID.0093) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 117 0 R /K <> /ID (ID.0093) >> endobj 125 0 obj << /Type /StructElem /S /mrow /NS 13 0 R /P 109 0 R /K [126 0 R 127 0 R] /ID (ID.0094) >> endobj 126 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 125 0 R /K <> /ID (ID.0095) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 125 0 R /K <> /ID (ID.0095) >> endobj 127 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 125 0 R /K <> /ID (ID.0096) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 125 0 R /K <> /ID (ID.0096) >> endobj 128 0 obj -<< /Type /StructElem /A 129 0 R /S /mo /NS 13 0 R /P 106 0 R /K <> /ID (ID.0097) >> +<< /Type /StructElem /A 129 0 R /S /mo /NS 13 0 R /P 106 0 R /K <> /ID (ID.0097) >> endobj 132 0 obj << /Type /StructElem /AF [131 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 133 0 R /ID (ID.0098) >> @@ -1257,16 +1266,16 @@ endobj << /Type /StructElem /S /munder /NS 13 0 R /P 133 0 R /K [135 0 R 137 0 R] /ID (ID.0100) >> endobj 135 0 obj -<< /Type /StructElem /A 136 0 R /S /mo /NS 13 0 R /P 134 0 R /K <> /ID (ID.0101) >> +<< /Type /StructElem /A 136 0 R /S /mo /NS 13 0 R /P 134 0 R /K <> /ID (ID.0101) >> endobj 137 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 134 0 R /K <> /ID (ID.0102) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 134 0 R /K <> /ID (ID.0102) >> endobj 138 0 obj << /Type /StructElem /S /munder /NS 13 0 R /P 133 0 R /K [139 0 R 140 0 R] /ID (ID.0103) >> endobj 139 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 138 0 R /K <> /ID (ID.0104) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 138 0 R /K <> /ID (ID.0104) >> endobj 140 0 obj << /Type /StructElem /S /mo /NS 13 0 R /P 138 0 R /ID (ID.0105) >> @@ -1275,19 +1284,19 @@ endobj << /Type /StructElem /S /mover /NS 13 0 R /P 133 0 R /K [142 0 R 143 0 R] /ID (ID.0106) >> endobj 142 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 141 0 R /K <> /ID (ID.0107) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 141 0 R /K <> /ID (ID.0107) >> endobj 143 0 obj -<< /Type /StructElem /A 144 0 R /ActualText /S /mo /NS 13 0 R /P 141 0 R /K <> /ID (ID.0108) >> +<< /Type /StructElem /A 144 0 R /ActualText /S /mo /NS 13 0 R /P 141 0 R /K <> /ID (ID.0108) >> endobj 145 0 obj << /Type /StructElem /S /msup /NS 13 0 R /P 133 0 R /K [146 0 R 147 0 R] /ID (ID.0109) >> endobj 146 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 145 0 R /K <> /ID (ID.0110) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 145 0 R /K <> /ID (ID.0110) >> endobj 147 0 obj -<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 145 0 R /K <> /ID (ID.0111) >> +<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 145 0 R /K <> /ID (ID.0111) >> endobj 151 0 obj << /Type /StructElem /AF [150 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 197 0 R /ID (ID.0112) >> @@ -1296,13 +1305,13 @@ endobj << /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K [153 0 R 154 0 R 155 0 R] /ID (ID.0113) >> endobj 153 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 152 0 R /K <> /ID (ID.0114) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 152 0 R /K <> /ID (ID.0114) >> endobj 154 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 152 0 R /K <> /ID (ID.0115) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 152 0 R /K <> /ID (ID.0115) >> endobj 155 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 152 0 R /K <> /ID (ID.0116) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 152 0 R /K <> /ID (ID.0116) >> endobj 156 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K [157 0 R 158 0 R 159 0 R 160 0 R 161 0 R] /ID (ID.0117) >> @@ -1311,16 +1320,16 @@ endobj << /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /ID (ID.0118) >> endobj 158 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 156 0 R /K <> /ID (ID.0119) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 156 0 R /K <> /ID (ID.0119) >> endobj 159 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /K <> /ID (ID.0120) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /K <> /ID (ID.0120) >> endobj 160 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /K <> /ID (ID.0121) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /K <> /ID (ID.0121) >> endobj 161 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /K <> /ID (ID.0122) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /K <> /ID (ID.0122) >> endobj 162 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 163 0 R /ID (ID.0123) >> @@ -1329,16 +1338,16 @@ endobj << /Type /StructElem /S /msup /NS 13 0 R /P 162 0 R /K [164 0 R 165 0 R] /ID (ID.0124) >> endobj 164 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 163 0 R /K <> /ID (ID.0125) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 163 0 R /K <> /ID (ID.0125) >> endobj 165 0 obj << /Type /StructElem /S /mrow /NS 13 0 R /P 163 0 R /K [166 0 R 167 0 R] /ID (ID.0126) >> endobj 166 0 obj -<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 165 0 R /K <> /ID (ID.0127) >> +<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 165 0 R /K <> /ID (ID.0127) >> endobj 167 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 165 0 R /K <> /ID (ID.0128) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 165 0 R /K <> /ID (ID.0128) >> endobj 168 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K [169 0 R 170 0 R 172 0 R 173 0 R] /ID (ID.0129) >> @@ -1347,76 +1356,76 @@ endobj << /Type /StructElem /S /mi /NS 13 0 R /P 168 0 R /ID (ID.0130) >> endobj 170 0 obj -<< /Type /StructElem /A 171 0 R /S /mo /NS 13 0 R /P 168 0 R /K <> /ID (ID.0131) >> +<< /Type /StructElem /A 171 0 R /S /mo /NS 13 0 R /P 168 0 R /K <> /ID (ID.0131) >> endobj 172 0 obj -<< /Type /StructElem /A 171 0 R /S /mo /NS 13 0 R /P 168 0 R /K <> /ID (ID.0132) >> +<< /Type /StructElem /A 171 0 R /S /mo /NS 13 0 R /P 168 0 R /K <> /ID (ID.0132) >> endobj 173 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 168 0 R /K <> /ID (ID.0133) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 168 0 R /K <> /ID (ID.0133) >> endobj 174 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 203 0 R /K [175 0 R 177 0 R 178 0 R 179 0 R] /ID (ID.0134) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 204 0 R /K [175 0 R 177 0 R 178 0 R 179 0 R] /ID (ID.0134) >> endobj 175 0 obj -<< /Type /StructElem /A 176 0 R /ActualText /S /mo /NS 13 0 R /P 174 0 R /K <> /ID (ID.0135) >> +<< /Type /StructElem /A 176 0 R /ActualText /S /mo /NS 13 0 R /P 174 0 R /K <> /ID (ID.0135) >> endobj 177 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 174 0 R /K <> /ID (ID.0136) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 174 0 R /K <> /ID (ID.0136) >> endobj 178 0 obj -<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 174 0 R /K <> /ID (ID.0137) >> +<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 174 0 R /K <> /ID (ID.0137) >> endobj 179 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 174 0 R /K <> /ID (ID.0138) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 174 0 R /K <> /ID (ID.0138) >> endobj 180 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 203 0 R /K [181 0 R 182 0 R 183 0 R 184 0 R] /ID (ID.0139) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 204 0 R /K [181 0 R 182 0 R 183 0 R 184 0 R] /ID (ID.0139) >> endobj 181 0 obj << /Type /StructElem /S /mi /NS 13 0 R /P 180 0 R /ID (ID.0140) >> endobj 182 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 180 0 R /K <> /ID (ID.0141) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 180 0 R /K <> /ID (ID.0141) >> endobj 183 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 180 0 R /K <> /ID (ID.0142) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 180 0 R /K <> /ID (ID.0142) >> endobj 184 0 obj -<< /Type /StructElem /A 176 0 R /ActualText /S /mo /NS 13 0 R /P 180 0 R /K <> /ID (ID.0143) >> +<< /Type /StructElem /A 176 0 R /ActualText /S /mo /NS 13 0 R /P 180 0 R /K <> /ID (ID.0143) >> endobj 185 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 203 0 R /K 186 0 R /ID (ID.0144) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 204 0 R /K 186 0 R /ID (ID.0144) >> endobj 186 0 obj << /Type /StructElem /S /mi /NS 13 0 R /P 185 0 R /ID (ID.0145) >> endobj 187 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 203 0 R /K 188 0 R /ID (ID.0146) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 204 0 R /K 188 0 R /ID (ID.0146) >> endobj 188 0 obj << /Type /StructElem /S /mi /NS 13 0 R /P 187 0 R /ID (ID.0147) >> endobj 189 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 206 0 R /K 190 0 R /ID (ID.0148) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 207 0 R /K 190 0 R /ID (ID.0148) >> endobj 190 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 189 0 R /K <> /ID (ID.0149) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 189 0 R /K <> /ID (ID.0149) >> endobj 191 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 206 0 R /K 192 0 R /ID (ID.0150) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 207 0 R /K 192 0 R /ID (ID.0150) >> endobj 192 0 obj << /Type /StructElem /S /mi /NS 13 0 R /P 191 0 R /ID (ID.0151) >> endobj 193 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 206 0 R /K 194 0 R /ID (ID.0152) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 207 0 R /K 194 0 R /ID (ID.0152) >> endobj 194 0 obj << /Type /StructElem /S /mi /NS 13 0 R /P 193 0 R /ID (ID.0153) >> endobj 195 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 206 0 R /K 196 0 R /ID (ID.0154) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 207 0 R /K 196 0 R /ID (ID.0154) >> endobj 196 0 obj << /Type /StructElem /S /mi /NS 13 0 R /P 195 0 R /ID (ID.0155) >> @@ -1425,97 +1434,97 @@ endobj << /Type /StructElem /A 80 0 R /S /math /NS 13 0 R /P 151 0 R /K 198 0 R /ID (ID.0156) >> endobj 198 0 obj -<< /Type /StructElem /A 199 0 R /S /mtable /NS 13 0 R /P 197 0 R /K [200 0 R 203 0 R 206 0 R] /ID (ID.0157) >> +<< /Type /StructElem /A 199 0 R /S /mtable /NS 13 0 R /P 197 0 R /K [200 0 R 204 0 R 207 0 R] /ID (ID.0157) >> endobj 200 0 obj -<< /Type /StructElem /S /mlabeledtr /NS 13 0 R /P 198 0 R /K [201 0 R 152 0 R 156 0 R 162 0 R 168 0 R] /ID (ID.0158) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 198 0 R /K [201 0 R 152 0 R 156 0 R 162 0 R 168 0 R] /ID (ID.0158) >> endobj 201 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 202 0 R /ID (ID.0159) >> -endobj -202 0 obj -<< /Type /StructElem /S /mtext /NS 13 0 R /P 201 0 R /ID (ID.0160) >> +<< /Type /StructElem /A 202 0 R /S /mtd /NS 13 0 R /P 200 0 R /K 203 0 R /ID (ID.0159) >> endobj 203 0 obj -<< /Type /StructElem /S /mlabeledtr /NS 13 0 R /P 198 0 R /K [204 0 R 174 0 R 180 0 R 185 0 R 187 0 R] /ID (ID.0161) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 201 0 R /ID (ID.0160) >> endobj 204 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 203 0 R /K 205 0 R /ID (ID.0162) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 198 0 R /K [205 0 R 174 0 R 180 0 R 185 0 R 187 0 R] /ID (ID.0161) >> endobj 205 0 obj -<< /Type /StructElem /S /mtext /NS 13 0 R /P 204 0 R /ID (ID.0163) >> +<< /Type /StructElem /A 202 0 R /S /mtd /NS 13 0 R /P 204 0 R /K 206 0 R /ID (ID.0162) >> endobj 206 0 obj -<< /Type /StructElem /S /mlabeledtr /NS 13 0 R /P 198 0 R /K [207 0 R 189 0 R 191 0 R 193 0 R 195 0 R] /ID (ID.0164) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 205 0 R /ID (ID.0163) >> endobj 207 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 206 0 R /K 208 0 R /ID (ID.0165) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 198 0 R /K [208 0 R 189 0 R 191 0 R 193 0 R 195 0 R] /ID (ID.0164) >> endobj 208 0 obj -<< /Type /StructElem /S /mtext /NS 13 0 R /P 207 0 R /ID (ID.0166) >> +<< /Type /StructElem /A 202 0 R /S /mtd /NS 13 0 R /P 207 0 R /K 209 0 R /ID (ID.0165) >> endobj -211 0 obj -<< /Type /StructElem /AF [210 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 212 0 R /ID (ID.0167) >> +209 0 obj +<< /Type /StructElem /S /mtext /NS 13 0 R /P 208 0 R /ID (ID.0166) >> endobj 212 0 obj -<< /Type /StructElem /S /math /NS 13 0 R /P 211 0 R /K [213 0 R 214 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R] /ID (ID.0168) >> +<< /Type /StructElem /AF [211 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 213 0 R /ID (ID.0167) >> endobj 213 0 obj -<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 212 0 R /K <> /ID (ID.0169) >> +<< /Type /StructElem /S /math /NS 13 0 R /P 212 0 R /K [214 0 R 215 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R] /ID (ID.0168) >> endobj 214 0 obj -<< /Type /StructElem /A 215 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0170) >> +<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 213 0 R /K <> /ID (ID.0169) >> endobj -216 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 212 0 R /K <> /ID (ID.0171) >> +215 0 obj +<< /Type /StructElem /A 216 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0170) >> endobj 217 0 obj -<< /Type /StructElem /A 215 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0172) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 213 0 R /K <> /ID (ID.0171) >> endobj 218 0 obj -<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0173) >> +<< /Type /StructElem /A 216 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0172) >> endobj 219 0 obj -<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 212 0 R /K <> /ID (ID.0174) >> +<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0173) >> endobj 220 0 obj -<< /Type /StructElem /A 215 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0175) >> +<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 213 0 R /K <> /ID (ID.0174) >> endobj 221 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 212 0 R /K <> /ID (ID.0176) >> +<< /Type /StructElem /A 216 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0175) >> endobj 222 0 obj -<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0177) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 213 0 R /K <> /ID (ID.0176) >> endobj 223 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 212 0 R /K <> /ID (ID.0178) >> +<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0177) >> endobj 224 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 212 0 R /K <> /ID (ID.0179) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 213 0 R /K <> /ID (ID.0178) >> endobj 225 0 obj -<< /Type /StructElem /A 215 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0180) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 213 0 R /K <> /ID (ID.0179) >> endobj 226 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 212 0 R /K <> /ID (ID.0181) >> +<< /Type /StructElem /A 216 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0180) >> endobj 227 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 212 0 R /K <> /ID (ID.0182) >> +<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0181) >> +endobj +228 0 obj +<< /Type /StructElem /S /mn /NS 13 0 R /P 213 0 R /K <> /ID (ID.0182) >> endobj 5 0 obj -<< /Type /StructTreeRoot /Namespaces 8 0 R /IDTree 243 0 R /ParentTree 6 0 R /RoleMap 7 0 R /K 21 0 R >> +<< /Type /StructTreeRoot /Namespaces 8 0 R /IDTree 244 0 R /ParentTree 6 0 R /RoleMap 7 0 R /K 21 0 R >> endobj -244 0 obj +245 0 obj [ 66 [ 323 ] ] endobj -246 0 obj +247 0 obj << /Subtype /CIDFontType0C /Length 592 >> [BINARY STREAM] endobj -245 0 obj -<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 246 0 R >> +246 0 obj +<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 247 0 R >> endobj -247 0 obj +248 0 obj << /Length 687 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1551,23 +1560,23 @@ end %%EOF endstream endobj -236 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 248 0 R ] /ToUnicode 247 0 R >> -endobj -248 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 245 0 R /W 244 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +237 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 249 0 R ] /ToUnicode 248 0 R >> endobj 249 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 246 0 R /W 245 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +250 0 obj [ 1013 [ 569 ] 1404 [ 620 ] 2981 [ 407 ] 4558 [ 668 ] ] endobj -251 0 obj +252 0 obj << /Subtype /CIDFontType0C /Length 1102 >> [BINARY STREAM] endobj -250 0 obj -<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 251 0 R >> +251 0 obj +<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 252 0 R >> endobj -252 0 obj +253 0 obj << /Length 772 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1606,23 +1615,23 @@ end %%EOF endstream endobj -235 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 253 0 R ] /ToUnicode 252 0 R >> -endobj -253 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 250 0 R /W 249 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +236 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 254 0 R ] /ToUnicode 253 0 R >> endobj 254 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 251 0 R /W 250 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +255 0 obj [ 9 [ 389 389 ] 12 [ 778 ] 15 [ 278 ] 17 [ 500 500 500 500 500 500 ] 30 [ 778 ] 1296 [ 529 429 433 520 466 490 ] 1319 [ 572 ] 1790 [ 0 ] 2455 [ 663 663 ] 2503 [ 875 875 875 875 875 875 ] 2515 [ 902 ] 2615 [ 778 ] 2619 [ 778 ] 3074 [ 1444 ] 3077 [ 833 ] 4474 [ 570 ] ] endobj -256 0 obj +257 0 obj << /Subtype /CIDFontType0C /Length 4088 >> [BINARY STREAM] endobj -255 0 obj -<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 256 0 R >> +256 0 obj +<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 257 0 R >> endobj -257 0 obj +258 0 obj << /Length 1203 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1690,23 +1699,23 @@ end %%EOF endstream endobj -234 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 258 0 R ] /ToUnicode 257 0 R >> -endobj -258 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 255 0 R /W 254 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +235 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 259 0 R ] /ToUnicode 258 0 R >> endobj 259 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 256 0 R /W 255 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +260 0 obj [ 49 [ 681 444 ] 55 [ 306 ] 59 [ 500 ] 63 [ 556 ] 66 [ 278 ] 72 [ 278 ] 77 [ 556 ] 81 [ 500 500 ] 85 [ 389 389 ] 88 [ 278 ] 98 [ 394 ] 103 [ 333 ] 105 [ 389 500 500 ] ] endobj -261 0 obj +262 0 obj << /Subtype /CIDFontType0C /Length 2411 >> [BINARY STREAM] endobj -260 0 obj -<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 261 0 R >> +261 0 obj +<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 262 0 R >> endobj -262 0 obj +263 0 obj << /Length 931 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1759,291 +1768,292 @@ end %%EOF endstream endobj -233 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 263 0 R ] /ToUnicode 262 0 R >> -endobj -263 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 260 0 R /W 259 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> -endobj -237 0 obj -<< /Type /Pages /Count 1 /Kids [ 231 0 R ] >> +234 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 264 0 R ] /ToUnicode 263 0 R >> endobj 264 0 obj -<< /Type /Catalog /Pages 237 0 R /MarkInfo 238 0 R/Lang (en)/Metadata 229 0 R/StructTreeRoot 5 0 R >> +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 261 0 R /W 260 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +238 0 obj +<< /Type /Pages /Count 1 /Kids [ 232 0 R ] >> endobj 265 0 obj +<< /Type /Catalog /Pages 238 0 R /MarkInfo 239 0 R/Lang (en)/Metadata 230 0 R/StructTreeRoot 5 0 R >> +endobj +266 0 obj << /Producer (LuaTeX)/Creator (TeX)/CreationDate (D:20160520090000Z)/ModDate (D:20160520090000Z) /Trapped /False >> endobj xref -0 266 +0 267 0000000002 65535 f -0000025623 00000 n +0000026064 00000 n 0000000003 00000 f 0000000004 00000 f 0000000010 00000 f -0000052921 00000 n -0000025707 00000 n -0000029835 00000 n -0000031787 00000 n -0000030414 00000 n +0000053379 00000 n +0000026148 00000 n +0000030276 00000 n +0000032230 00000 n +0000030855 00000 n 0000000012 00000 f -0000030482 00000 n +0000030923 00000 n 0000000014 00000 f -0000030552 00000 n +0000030993 00000 n 0000000020 00000 f -0000031315 00000 n -0000030633 00000 n -0000031593 00000 n -0000031422 00000 n -0000031700 00000 n +0000031756 00000 n +0000031074 00000 n +0000032034 00000 n +0000031863 00000 n +0000032141 00000 n 0000000000 00000 f -0000031848 00000 n -0000031947 00000 n -0000032088 00000 n -0000001680 00000 n -0000032210 00000 n -0000032322 00000 n -0000032417 00000 n -0000032540 00000 n -0000032635 00000 n -0000032758 00000 n -0000032853 00000 n -0000032976 00000 n -0000033071 00000 n -0000033194 00000 n -0000033289 00000 n -0000033412 00000 n -0000033507 00000 n -0000033630 00000 n -0000033725 00000 n -0000033848 00000 n -0000033943 00000 n -0000034066 00000 n -0000034161 00000 n -0000034285 00000 n -0000034380 00000 n -0000034504 00000 n -0000034606 00000 n -0000034702 00000 n +0000032291 00000 n +0000032390 00000 n +0000032531 00000 n +0000001687 00000 n +0000032653 00000 n +0000032765 00000 n +0000032860 00000 n +0000032983 00000 n +0000033078 00000 n +0000033201 00000 n +0000033296 00000 n +0000033419 00000 n +0000033514 00000 n +0000033637 00000 n +0000033732 00000 n +0000033855 00000 n +0000033950 00000 n +0000034073 00000 n +0000034168 00000 n +0000034291 00000 n +0000034386 00000 n +0000034509 00000 n +0000034604 00000 n +0000034728 00000 n +0000034823 00000 n +0000034947 00000 n +0000035049 00000 n +0000035145 00000 n 0000000020 00000 n -0000034827 00000 n -0000034911 00000 n -0000000092 00000 n -0000035006 00000 n -0000035090 00000 n -0000035226 00000 n -0000035338 00000 n -0000035462 00000 n -0000035597 00000 n -0000035721 00000 n -0000035823 00000 n -0000035935 00000 n -0000036019 00000 n -0000036114 00000 n -0000036198 00000 n -0000036300 00000 n -0000036412 00000 n -0000036496 00000 n -0000036591 00000 n -0000036675 00000 n -0000036779 00000 n -0000036863 00000 n -0000036959 00000 n -0000037083 00000 n -0000037172 00000 n -0000037299 00000 n -0000037388 00000 n -0000037477 00000 n -0000037582 00000 n -0000037666 00000 n -0000000162 00000 n -0000037789 00000 n -0000037915 00000 n -0000000215 00000 n -0000038072 00000 n -0000000301 00000 n -0000038171 00000 n -0000000355 00000 n -0000038281 00000 n -0000038395 00000 n -0000038506 00000 n -0000038617 00000 n -0000038728 00000 n -0000038827 00000 n -0000038985 00000 n -0000039120 00000 n -0000039233 00000 n -0000039391 00000 n -0000039501 00000 n -0000039609 00000 n -0000039713 00000 n -0000039818 00000 n -0000000426 00000 n -0000000480 00000 n -0000002591 00000 n -0000039919 00000 n -0000040034 00000 n -0000040170 00000 n -0000040296 00000 n -0000040433 00000 n -0000040543 00000 n -0000040668 00000 n -0000001832 00000 n -0000040806 00000 n -0000040932 00000 n -0000001897 00000 n -0000041070 00000 n -0000041170 00000 n -0000041303 00000 n -0000041412 00000 n -0000041538 00000 n -0000041664 00000 n -0000041802 00000 n -0000041928 00000 n -0000042054 00000 n -0000042180 00000 n -0000042289 00000 n -0000042415 00000 n -0000042541 00000 n -0000001968 00000 n -0000002027 00000 n -0000003353 00000 n -0000042679 00000 n -0000042794 00000 n -0000042930 00000 n -0000043041 00000 n -0000002744 00000 n -0000043179 00000 n -0000043305 00000 n -0000043416 00000 n -0000043542 00000 n -0000043628 00000 n -0000043738 00000 n -0000043864 00000 n -0000002829 00000 n -0000044025 00000 n -0000044134 00000 n -0000044260 00000 n -0000002883 00000 n -0000002942 00000 n -0000005031 00000 n -0000044398 00000 n -0000044513 00000 n -0000044629 00000 n -0000044755 00000 n -0000044881 00000 n -0000045007 00000 n -0000045139 00000 n -0000045225 00000 n -0000045362 00000 n -0000045488 00000 n -0000045614 00000 n -0000045740 00000 n -0000045838 00000 n -0000045947 00000 n -0000046073 00000 n -0000046182 00000 n -0000046320 00000 n -0000046446 00000 n -0000046570 00000 n -0000046656 00000 n -0000003506 00000 n -0000046794 00000 n -0000046932 00000 n -0000047058 00000 n -0000047182 00000 n -0000003571 00000 n -0000047343 00000 n -0000047469 00000 n -0000047607 00000 n -0000047733 00000 n -0000047857 00000 n -0000047943 00000 n -0000048080 00000 n -0000048206 00000 n -0000048367 00000 n -0000048465 00000 n -0000048551 00000 n +0000035270 00000 n +0000035354 00000 n +0000000093 00000 n +0000035449 00000 n +0000035533 00000 n +0000035669 00000 n +0000035781 00000 n +0000035905 00000 n +0000036040 00000 n +0000036164 00000 n +0000036266 00000 n +0000036378 00000 n +0000036462 00000 n +0000036557 00000 n +0000036641 00000 n +0000036743 00000 n +0000036855 00000 n +0000036939 00000 n +0000037034 00000 n +0000037118 00000 n +0000037222 00000 n +0000037306 00000 n +0000037402 00000 n +0000037526 00000 n +0000037615 00000 n +0000037742 00000 n +0000037831 00000 n +0000037920 00000 n +0000038025 00000 n +0000038109 00000 n +0000000164 00000 n +0000038232 00000 n +0000038358 00000 n +0000000218 00000 n +0000038515 00000 n +0000000305 00000 n +0000038614 00000 n +0000000360 00000 n +0000038724 00000 n +0000038838 00000 n +0000038949 00000 n +0000039060 00000 n +0000039171 00000 n +0000039270 00000 n +0000039428 00000 n +0000039563 00000 n +0000039676 00000 n +0000039834 00000 n +0000039944 00000 n +0000040052 00000 n +0000040156 00000 n +0000040261 00000 n +0000000432 00000 n +0000000487 00000 n +0000002601 00000 n +0000040362 00000 n +0000040477 00000 n +0000040613 00000 n +0000040739 00000 n +0000040876 00000 n +0000040986 00000 n +0000041111 00000 n +0000001839 00000 n +0000041249 00000 n +0000041375 00000 n +0000001905 00000 n +0000041513 00000 n +0000041613 00000 n +0000041746 00000 n +0000041855 00000 n +0000041981 00000 n +0000042107 00000 n +0000042245 00000 n +0000042371 00000 n +0000042497 00000 n +0000042623 00000 n +0000042732 00000 n +0000042858 00000 n +0000042984 00000 n +0000001977 00000 n +0000002037 00000 n +0000003366 00000 n +0000043122 00000 n +0000043237 00000 n +0000043373 00000 n +0000043484 00000 n +0000002754 00000 n +0000043622 00000 n +0000043748 00000 n +0000043859 00000 n +0000043985 00000 n +0000044071 00000 n +0000044181 00000 n +0000044307 00000 n +0000002840 00000 n +0000044468 00000 n +0000044577 00000 n +0000044703 00000 n +0000002895 00000 n +0000002955 00000 n +0000005140 00000 n +0000044841 00000 n +0000044956 00000 n +0000045072 00000 n +0000045198 00000 n +0000045324 00000 n +0000045450 00000 n +0000045582 00000 n +0000045668 00000 n +0000045805 00000 n +0000045931 00000 n +0000046057 00000 n +0000046183 00000 n +0000046281 00000 n +0000046390 00000 n +0000046516 00000 n +0000046625 00000 n +0000046763 00000 n +0000046889 00000 n +0000047013 00000 n +0000047099 00000 n +0000003519 00000 n +0000047237 00000 n +0000047375 00000 n +0000047501 00000 n +0000047625 00000 n +0000003585 00000 n +0000047786 00000 n +0000047912 00000 n +0000048050 00000 n +0000048176 00000 n +0000048300 00000 n +0000048386 00000 n +0000048523 00000 n 0000048649 00000 n -0000048735 00000 n -0000048833 00000 n -0000048959 00000 n -0000049057 00000 n -0000049143 00000 n -0000049241 00000 n -0000049327 00000 n -0000049425 00000 n -0000049511 00000 n -0000049621 00000 n -0000003694 00000 n -0000049752 00000 n -0000049891 00000 n -0000049989 00000 n -0000050078 00000 n -0000050217 00000 n -0000050315 00000 n -0000050404 00000 n -0000050543 00000 n -0000050641 00000 n -0000003811 00000 n -0000005865 00000 n -0000050730 00000 n -0000050845 00000 n -0000051050 00000 n +0000048810 00000 n +0000048908 00000 n +0000048994 00000 n +0000049092 00000 n +0000049178 00000 n +0000049276 00000 n +0000049402 00000 n +0000049500 00000 n +0000049586 00000 n +0000049684 00000 n +0000049770 00000 n +0000049868 00000 n +0000049954 00000 n +0000050064 00000 n +0000003709 00000 n +0000050195 00000 n +0000050327 00000 n +0000003827 00000 n +0000050437 00000 n +0000050526 00000 n +0000050658 00000 n +0000050768 00000 n +0000050857 00000 n +0000050989 00000 n +0000051099 00000 n +0000003890 00000 n +0000005975 00000 n 0000051188 00000 n -0000005184 00000 n -0000051326 00000 n -0000051452 00000 n -0000051590 00000 n -0000051728 00000 n -0000051866 00000 n -0000052004 00000 n -0000052130 00000 n -0000052268 00000 n -0000052394 00000 n -0000052520 00000 n -0000052658 00000 n -0000052795 00000 n -0000005259 00000 n -0000006018 00000 n -0000025519 00000 n -0000025380 00000 n -0000017471 00000 n -0000067997 00000 n -0000063728 00000 n -0000057404 00000 n -0000054722 00000 n -0000068357 00000 n -0000025670 00000 n -0000026338 00000 n -0000027250 00000 n -0000028190 00000 n -0000029152 00000 n -0000029772 00000 n -0000053042 00000 n -0000053751 00000 n -0000053074 00000 n -0000053974 00000 n -0000054878 00000 n -0000055080 00000 n -0000056340 00000 n -0000055153 00000 n -0000056571 00000 n -0000057567 00000 n -0000057776 00000 n -0000062234 00000 n -0000058061 00000 n -0000062464 00000 n -0000063891 00000 n -0000064100 00000 n -0000066782 00000 n -0000064286 00000 n -0000067005 00000 n -0000068154 00000 n -0000068421 00000 n -0000068540 00000 n +0000051303 00000 n +0000051508 00000 n +0000051646 00000 n +0000005293 00000 n +0000051784 00000 n +0000051910 00000 n +0000052048 00000 n +0000052186 00000 n +0000052324 00000 n +0000052462 00000 n +0000052588 00000 n +0000052726 00000 n +0000052852 00000 n +0000052978 00000 n +0000053116 00000 n +0000053253 00000 n +0000005369 00000 n +0000006128 00000 n +0000025960 00000 n +0000025821 00000 n +0000017912 00000 n +0000068455 00000 n +0000064186 00000 n +0000057862 00000 n +0000055180 00000 n +0000068815 00000 n +0000026111 00000 n +0000026779 00000 n +0000027691 00000 n +0000028631 00000 n +0000029593 00000 n +0000030213 00000 n +0000053500 00000 n +0000054209 00000 n +0000053532 00000 n +0000054432 00000 n +0000055336 00000 n +0000055538 00000 n +0000056798 00000 n +0000055611 00000 n +0000057029 00000 n +0000058025 00000 n +0000058234 00000 n +0000062692 00000 n +0000058519 00000 n +0000062922 00000 n +0000064349 00000 n +0000064558 00000 n +0000067240 00000 n +0000064744 00000 n +0000067463 00000 n +0000068612 00000 n +0000068879 00000 n +0000068998 00000 n trailer -<< /Size 266 /Root 264 0 R /Info 265 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> +<< /Size 267 /Root 265 0 R /Info 266 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> startxref -68673 +69131 %%EOF diff --git a/testfiles-lua/test_xml.mlr b/testfiles-lua/test_xml.mlr index ab9f5ed..94a71cc 100644 --- a/testfiles-lua/test_xml.mlr +++ b/testfiles-lua/test_xml.mlr @@ -145,8 +145,8 @@ - - + + (1) @@ -176,9 +176,9 @@ โˆ’ 1 - - - + + + (2) @@ -199,9 +199,9 @@ - - - + + + (3) @@ -216,7 +216,7 @@ - + From 8389cd1a9d8b84d1687a0fb53a30fd36911cdd8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Tue, 29 Oct 2024 06:37:12 +0100 Subject: [PATCH 127/206] GH Actions setup --- .github/actions/ctan-upload/action.yaml | 38 ++++++++++++ .github/tl_packages | 59 +++++++++++++++++++ .github/workflows/deploy.yaml | 78 +++++++++++++++++++++++++ .github/workflows/main.yaml | 53 +++++++++++++++++ 4 files changed, 228 insertions(+) create mode 100644 .github/actions/ctan-upload/action.yaml create mode 100644 .github/tl_packages create mode 100644 .github/workflows/deploy.yaml create mode 100644 .github/workflows/main.yaml diff --git a/.github/actions/ctan-upload/action.yaml b/.github/actions/ctan-upload/action.yaml new file mode 100644 index 0000000..9c278a8 --- /dev/null +++ b/.github/actions/ctan-upload/action.yaml @@ -0,0 +1,38 @@ +name: CTAN upload + +inputs: + filename: + required: true + dry-run: + required: true + uploader: + required: true + email: + required: true + version: + required: false + default: ${{ github.ref_name }} + +runs: + using: composite + steps: + - name: Send to CTAN + uses: zauguin/ctan-upload@v0.1 + with: + package-name: luaotfload + version: ${{ inputs.version }} + author: 'Marcel Krรผger, LaTeX Project Team' + uploader: ${{ inputs.uploader }} + email: ${{ inputs.email }} + license: lppl1.3 + summary: "Automatically generate MathML from LuaLaTeX math mode material" + ctan-path: /macros/luatex/latex/luamml + support: https://github.com/latex3/luamml/issues + update: true + topic: maths,luatex + description: | + LuaMML is an experimental package to automatically generate a MathML representation of mathematical expessions written in LuaLaTeX documents. These MathML representations can be used for improving accessibility or to ease conversion into new output formats like HTML. + filename: ${{ inputs.filename }} + dry-run: ${{ inputs.dry-run }} + announcement-filename: ctan.ann + note: Uploaded automatically by GitHub Actions. diff --git a/.github/tl_packages b/.github/tl_packages new file mode 100644 index 0000000..0630b10 --- /dev/null +++ b/.github/tl_packages @@ -0,0 +1,59 @@ +scheme-minimal latex-bin l3build +#Proudly generated by the Island of TeX's DEPendency Printer https://gitlab.com/islandoftex/texmf/depp +alphalph +amsfonts +amsmath +bigintcalc +bitset +bookmark +booktabs +cm +colortbl +csquotes +enumitem +etoolbox +fancyvrb +firstaid +fontspec +gettitlestring +graphics +graphics-cfg +graphics-def +hologo +hycolor +hypdoc +hyperref +iftex +infwarerr +intcalc +knuth-lib +kvdefinekeys +kvoptions +kvsetkeys +l3backend +l3build +l3kernel +l3packages +latex +latex-fonts +latex-lab +lm +lm-math +ltxcmds +luacolor +lualatex-math +pdfescape +pdfmanagement-testphase +pdftexcmds +psnfss +refcount +rerunfilecheck +stringenc +symbol +tagpdf +tools +underscore +unicode-math +uniquecounter +url +zapfding diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml new file mode 100644 index 0000000..5227c45 --- /dev/null +++ b/.github/workflows/deploy.yaml @@ -0,0 +1,78 @@ +name: Release + +on: + # Only triggers for new tags + push: + tags: "*" + +jobs: + # Mostly the same as the main.yaml workflow, but we only use a single job + l3build: + runs-on: ubuntu-latest + steps: + # Boilerplate + - name: Checkout repository + uses: actions/checkout@v4 + - run: sudo apt-get install tidy + - name: Install TeX Live + uses: zauguin/install-texlive@v3 + with: + # Here we use the same list of packages as in the testing workflow. + package_file: .github/tl_packages + - name: Run l3build + run: l3build ctan -H --show-log-on-error + - name: Upload package artifact + uses: actions/upload-artifact@v4 + with: + name: Package + path: | + build/distrib/ctan/*.zip + ctan.ann + - name: Validate CTAN package + uses: ./.github/actions/ctan-upload + with: + uploader: Dummy Name + email: dryrun@example.com + filename: "build/distrib/ctan/luaotfload-ctan.zip" + dry-run: true + + github: + runs-on: ubuntu-latex + needs: + - l3build + steps: + - name: Download package artifact + uses: actions/download-artifact@v4 + with: + name: Package + - name: Create GitHub release + uses: ncipollo/release-action@2c591bcc8ecdcd2db72b97d6147f871fcd833ba5 + id: release + with: + artifacts: "build/distrib/ctan/*.zip" + prerelease: ${{ endsWith(github.ref, '-dev') }} + token: ${{ secrets.GITHUB_TOKEN }} + bodyFile: ctan.ann + + ctan-upload: + if: "${{ !endsWith(github.ref, '-dev') }}" + runs-on: ubuntu-latest + environment: CTAN + needs: + - l3build + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + sparse-checkout: .github + - name: Download package artifact + uses: actions/download-artifact@v4 + with: + name: Package + - name: Upload CTAN package + uses: ./.github/actions/ctan-upload + with: + uploader: ${{ secrets.CTAN_NAME }} + email: ${{ secrets.CTAN_EMAIL }} + filename: "build/distrib/ctan/luaotfload-ctan.zip" + dry-run: false diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml new file mode 100644 index 0000000..16d3751 --- /dev/null +++ b/.github/workflows/main.yaml @@ -0,0 +1,53 @@ +name: Automated testing + +# Currently we run in two situations: +on: + # Whenever someone pushes to a branch or tag in our repo + push: + branches: + - "*" + # Whenever a pull request is opened, reopened or gets new commits. + pull_request: +# This implies that for every push to a local branch in our repo for which a +# pull request is open this runs twice. But it's important to ensure that pull +# requests get tested even if their branch comes from a fork. + +jobs: + l3build: + runs-on: ubuntu-latest + strategy: + matrix: + kind: [doc, test] + name: "${{ format('{0}', matrix.kind == 'doc' && 'Documentation' || 'Test suite') }}" + steps: + # Boilerplate + - name: Checkout repository + uses: actions/checkout@v4 + - run: sudo apt-get install tidy + - name: Install TeX Live + uses: zauguin/install-texlive@v3 + with: + # The list of packages to install is in a separate file under .github/tl_packages + # to allow reuse. + package_file: .github/tl_packages + cache_version: 0 + - name: Run l3build + run: ${{ format('l3build {0} -q -H', matrix.kind == 'doc' && 'doc' || 'check --show-log-on-error') }} + # Now we create the artifacts: There are two cases where this happens. + # 1. If we failed running tests + - name: Archive failed test output + if: ${{ matrix.kind == 'test' && always() }} + uses: zauguin/l3build-failure-artifacts@v1 + with: + name: testfiles-${{ matrix.platform }} + # Decide how long to keep the test output artifact: + retention-days: 3 + # 2. If we succeed building documentation + - name: Archive documentation + if: ${{ matrix.kind == 'doc' && success() }} + uses: actions/upload-artifact@v4 + with: + name: Documentation + path: "**/*.pdf" + # Decide how long to keep the test output artifact: + retention-days: 21 From 4849ee437369025120cac69f17e68b08758a5191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 30 Oct 2024 00:39:46 +0100 Subject: [PATCH 128/206] Update version --- .github/actions/ctan-upload/action.yaml | 2 +- luamml-demo.sty | 2 +- luamml-patches-amsmath.sty | 2 +- luamml-patches-amstext.sty | 2 +- luamml-patches-array.sty | 2 +- luamml-patches-kernel.sty | 2 +- luamml-patches-lab-math.sty | 2 +- luamml-patches-mathtools.sty | 2 +- luamml-pdf-demo.sty | 2 +- luamml.dtx | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/actions/ctan-upload/action.yaml b/.github/actions/ctan-upload/action.yaml index 9c278a8..c3e0825 100644 --- a/.github/actions/ctan-upload/action.yaml +++ b/.github/actions/ctan-upload/action.yaml @@ -34,5 +34,5 @@ runs: LuaMML is an experimental package to automatically generate a MathML representation of mathematical expessions written in LuaLaTeX documents. These MathML representations can be used for improving accessibility or to ease conversion into new output formats like HTML. filename: ${{ inputs.filename }} dry-run: ${{ inputs.dry-run }} - announcement-filename: ctan.ann + # announcement-filename: ctan.ann note: Uploaded automatically by GitHub Actions. diff --git a/luamml-demo.sty b/luamml-demo.sty index 82bed7f..9aabb38 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -1,5 +1,5 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesExplPackage{luamml-demo}{2024-08-14}{v0.1.0}{Reasonable default definitions for luamml} +\ProvidesExplPackage{luamml-demo}{2024-10-30}{0.2.0}{Reasonable default definitions for luamml} \sys_if_engine_luatex:F { \msg_new:nnn {luamml-demo} {pdftex-option-ignored} {Option~`#1'~is~being~ignored~in~pdfTeX~mode.} diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index d9a47f0..0b09bc7 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-amsmath} {2024-08-14} {0.1.0} +\ProvidesExplPackage {luamml-patches-amsmath} {2024-10-30} {0.2.0} {Feel free to add a description here} \lua_now:n { require'luamml-amsmath' } diff --git a/luamml-patches-amstext.sty b/luamml-patches-amstext.sty index 2217600..97b1b1f 100644 --- a/luamml-patches-amstext.sty +++ b/luamml-patches-amstext.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-amstext} {2024-08-14} {0.1.0} +\ProvidesExplPackage {luamml-patches-amstext} {2024-10-30} {0.2.0} {Feel free to add a description here} \int_new:N \g__luamml_amsmath_text_struct_int diff --git a/luamml-patches-array.sty b/luamml-patches-array.sty index e4df3d8..b08d561 100644 --- a/luamml-patches-array.sty +++ b/luamml-patches-array.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-array} {2024-08-14} {0.1.0} +\ProvidesExplPackage {luamml-patches-array} {2024-10-30} {0.2.0} {Feel free to add a description here} \lua_now:n { require'luamml-array' } diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index bc920ac..38eb28b 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-kernel} {2024-08-14} {0.1.0} +\ProvidesExplPackage {luamml-patches-kernel} {2024-10-30} {0.2.0} {Feel free to add a description here} \cs_set:Npn \mathsm@sh #1 #2 { diff --git a/luamml-patches-lab-math.sty b/luamml-patches-lab-math.sty index e2d12c3..7776576 100644 --- a/luamml-patches-lab-math.sty +++ b/luamml-patches-lab-math.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-lab-math} {2024-08-14} {0.1.0} +\ProvidesExplPackage {luamml-patches-lab-math} {2024-10-30} {0.2.0} {Feel free to add a description here} \AddToHook{begindocument} { diff --git a/luamml-patches-mathtools.sty b/luamml-patches-mathtools.sty index f73ced8..3dc1570 100644 --- a/luamml-patches-mathtools.sty +++ b/luamml-patches-mathtools.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-mathtools} {2024-10-26} {0.1.0} +\ProvidesExplPackage {luamml-patches-mathtools} {2024-10-26} {0.2.0} {Feel free to add a description here} \RequirePackage{luamml-patches-amsmath} diff --git a/luamml-pdf-demo.sty b/luamml-pdf-demo.sty index fe63814..73c93f0 100644 --- a/luamml-pdf-demo.sty +++ b/luamml-pdf-demo.sty @@ -1,5 +1,5 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesExplPackage{luamml-pdf-demo}{2024-08-14}{v0.1.0}{Reasonable default definitions for luamml-pdf} +\ProvidesExplPackage{luamml-pdf-demo}{2024-10-30}{0.2.0}{Reasonable default definitions for luamml-pdf} \RequirePackage{luamml-pdf}% Loading luamml-pdf is pretty much the point % \RequirePackage{amsmath,array}% May come back if the patches get ported diff --git a/luamml.dtx b/luamml.dtx index e45295b..651185a 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -114,11 +114,11 @@ % \begin{macrocode} %<@@=luamml> %<*luatex> -\ProvidesExplPackage {luamml} {2024-08-14} {0.1.0} +\ProvidesExplPackage {luamml} {2024-10-30} {0.2.0} {Automatically generate presentational MathML from LuaTeX math expressions} % %<*pdftex> -\ProvidesExplPackage {luamml-pdf} {2024-08-14} {0.1.0} +\ProvidesExplPackage {luamml-pdf} {2024-10-30} {0.2.0} {MathML generation for LฬถuฬถaฬถpdfLaTeX} % % \end{macrocode} From 43825dcac438041298d9bb50a12eba2da92fb504 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Thu, 21 Nov 2024 06:28:30 +0100 Subject: [PATCH 129/206] add support for \tag_struct_use_num:n (#4) add support for \tag_struct_use_num:n --- .github/tl_packages | 1 + luamml-structelemwriter.lua | 6 + luamml-tex-annotate.lua | 12 + luamml.dtx | 18 +- testfiles-lua/test_structnum.pvt | 35 ++ testfiles-lua/test_structnum.tpf | 783 +++++++++++++++++++++++++++++++ 6 files changed, 854 insertions(+), 1 deletion(-) create mode 100644 testfiles-lua/test_structnum.pvt create mode 100644 testfiles-lua/test_structnum.tpf diff --git a/.github/tl_packages b/.github/tl_packages index 0630b10..ea7ca2b 100644 --- a/.github/tl_packages +++ b/.github/tl_packages @@ -34,6 +34,7 @@ l3backend l3build l3kernel l3packages +l3experimental latex latex-fonts latex-lab diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index 97a90ac..7c2e549 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -1,5 +1,6 @@ local struct_begin = token.create'tag_struct_begin:n' local struct_use = token.create'tag_struct_use:n' +local struct_use_num = token.create'tag_struct_use_num:n' local struct_end = token.create'tag_struct_end:' local mc_begin = token.create'tag_mc_begin:n' @@ -65,6 +66,11 @@ local function write_elem(tree, stash) return tex.sprint(struct_use, '{', tree[':struct'], '}') end) end + if tree[':structnum'] then + return tex.runtoks(function() + return tex.sprint(struct_use_num, '{', tree[':structnum'], '}') + end) + end if not tree[0] then print('ERR', require'inspect'(tree)) end local i = 0 for attr, val in next, tree do if type(attr) == 'string' and not string.find(attr, ':') and attr ~= 'xmlns' then diff --git a/luamml-tex-annotate.lua b/luamml-tex-annotate.lua index 050a00a..958b3ee 100644 --- a/luamml-tex-annotate.lua +++ b/luamml-tex-annotate.lua @@ -83,6 +83,18 @@ local function annotate() end end end + if annotation.structnum ~= nil then + local saved = props.mathml_filter + local structnum = annotation.structnum + function props.mathml_filter(mml, core) + mml[':structnum'] = structnum + if saved then + return saved(mml, core) + else + return mml, core + end + end + end else tex.error'Unable to annotate nucleus of node without nucleus' end diff --git a/luamml.dtx b/luamml.dtx index 651185a..c45dca1 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -93,7 +93,23 @@ % } % \end{verbatim} % produces a |TeX| element in the output instead of trying to import \TeX~as a mathematical expression. -% The table structure is explained in an appendix. +% +% It it possible to add a structure around the construct, stash that structure +% and then to tell \cmd{luamml_annotate:en} to insert it later inside the math. +% For this the keys \texttt{struct} (which takes a label as argument) or \texttt{structnum} +% (which takes a structure number) can be used. For example +% \begin{verbatim} +% $a = b \quad +% \tagstructbegin{tag=mtext,stash}\tagmcbegin{} +% \luamml_annotate:en{nucleus=true,structnum=\tag_get:n{struct_num}} +% {\mbox{some~text~with~\emph{structure}}} +% \tagmcend\tagstructend +% $ +% \end{verbatim} +% Such a construction should check that the flag for structure elements has actually +% been set to avoid orphaned structures if the stashed structure is ignored. +% +% More about the table structure is explained in an appendix. % % \section{Features \& Limitations} % Currently all mathematical expressions which purely contain Unicode encoded math mode material without embedded non-math should get converted successfully. diff --git a/testfiles-lua/test_structnum.pvt b/testfiles-lua/test_structnum.pvt new file mode 100644 index 0000000..a9e3ca3 --- /dev/null +++ b/testfiles-lua/test_structnum.pvt @@ -0,0 +1,35 @@ +\ExplSyntaxOn +\sys_gset_rand_seed:n{42} +\ExplSyntaxOff +\DocumentMetadata{ + lang=en, + testphase={phase-III,math}, + pdfversion=2.0, + pdfstandard=ua-2, + pdfstandard=a-4f, + uncompress +} +\input{regression-test} +\documentclass{article} + +\usepackage{unicode-math} + +% suppress writing of luamml-mathml +\tagpdfsetup{math/mathml/luamml/write=false} % + +% suppress mathml-AF reading +\tagpdfsetup{math/mathml/sources=} % +\tagpdfsetup{math/mathml/AF=false} +\begin{document} +\ExplSyntaxOn + +\luamml_structelem: +$a = b \quad + \tagstructbegin{tag=mtext,stash}\tagmcbegin{} + \luamml_annotate:en{nucleus=true,structnum=\tag_get:n{struct_num}} + {\mbox{some~text~with~\emph{structure}}} + \tagmcend\tagstructend +$ +\ExplSyntaxOff +\end{document} + diff --git a/testfiles-lua/test_structnum.tpf b/testfiles-lua/test_structnum.tpf new file mode 100644 index 0000000..6cd2230 --- /dev/null +++ b/testfiles-lua/test_structnum.tpf @@ -0,0 +1,783 @@ +%PDF-2.0 +%ฬีมิลุะฤฦ +22 0 obj +<< /N 3 /Length 3268 >> +[BINARY STREAM] +endobj +23 0 obj +<< /Type /OutputIntent /S /GTS_PDFA1 /DestOutputProfile 22 0 R /OutputConditionIdentifier (IEC\040sRGB) /Info (IEC\04061966-2.1\040Default\040RGB\040colour\040space\040-\040sRGB) /RegistryName (http://www.iec.ch) >> +endobj +29 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 192 >> +stream +$a=b\quad \tagstructbegin {tag=mtext,stash}\tagmcbegin {}\luamml_annotate:en {nucleus=true,structnum=\tag_get:n {struct_num}}{\mbox {some text with \emph {structure}}}\tagmcend \tagstructend $ +endstream +endobj +30 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile1.tex) /UF /EF<> >> +endobj +36 0 obj +<< /O/NSO/NS130R/lspace(0.278em)/rspace(0.278em) >> +endobj +39 0 obj +<< /O/NSO/NS130R/width(9.963pt) >> +endobj +40 0 obj +<< /Type /Metadata /Subtype /XML /Length 16669 >> +stream + + + + + + + + XMP Media Management Schema + xmpMM + http://ns.adobe.com/xap/1.0/mm/ + + + + OriginalDocumentID + URI + internal + The common identifier for all versions and renditions of a document. + + + + + + PDF/A Identification Schema + pdfaid + http://www.aiim.org/pdfa/ns/id/ + + + + year + Integer + internal + Year of standard + + + rev + Integer + internal + Revision year of standard + + + + + + PDF/UA Universal Accessibility Schema + pdfuaid + http://www.aiim.org/pdfua/ns/id/ + + + + part + Integer + internal + Part of ISO 14289 standard + + + rev + Integer + internal + Revision of ISO 14289 standard + + + + + + PDF/X ID Schema + pdfxid + http://www.npes.org/pdfx/ns/id/ + + + + GTS_PDFXVersion + Text + internal + ID of PDF/X standard + + + + + + PRISM Basic Metadata + prism + http://prismstandard.org/namespaces/basic/3.0/ + + + + complianceProfile + Text + internal + PRISM specification compliance profile to which this document adheres + + + publicationName + Text + external + Publication name + + + aggregationType + Text + external + Publication type + + + bookEdition + Text + external + Edition of the book in which the document was published + + + volume + Text + external + Publication volume number + + + number + Text + external + Publication issue number within a volume + + + pageRange + Text + external + Page range for the document within the print version of its publication + + + issn + Text + external + ISSN for the printed publication in which the document was published + + + eIssn + Text + external + ISSN for the electronic publication in which the document was published + + + isbn + Text + external + ISBN for the publication in which the document was published + + + doi + Text + external + Digital Object Identifier for the document + + + url + URL + external + URL at which the document can be found + + + byteCount + Integer + internal + Approximate file size in octets + + + pageCount + Integer + internal + Number of pages in the print version of the document + + + subtitle + Text + external + Document's subtitle + + + + + + PDF Declarations Schema + pdfd + http://pdfa.org/declarations/ + + + + declarations + Bag declaration + external + An unordered array of PDF Declaration entries, where each PDF Declaration representing a statement of conformance with an identified external standard or profile, along with optional information identifying the nature of the claim. + + + + + + + claim + http://pdfa.org/declarations/ + pdfd + A structure describing properties of an individualclaim. + + + + claimReport + Text + A URL to a report containing details of the specific conformance claim. + + + claimCredentials + Text + The claimant's credentials. + + + claimDate + Text + A date identifying when the claim was made. + + + claimBy + Text + The name of the organization and/or individual and/or software making the claim. + + + + + + declaration + http://pdfa.org/declarations/ + pdfd + A structure describing a single PDF Declaration asserting conformance with an externally-identified standard or profile. + + + + conformsTo + Text + A property containing a URI specifying the standard or profile by the PDF Declaration. This property is intended to mirror the Dublin Core property dc:conformsTo. + + + claimData + Bag claim + An unordered array of claim data, where each claim identifies the nature of the claim. + + + + + + + + + + luahbtex-NN.NN.NN + 2.0 + 4 + F + 2020 + 2 + 2024 + + + + http://pdfa.org/declarations/wtpdf#accessibility1.0 + + + + LaTeX Project + 2016-05-20 + + + + + + http://pdfa.org/declarations/wtpdf#reuse1.0 + + + + LaTeX Project + 2016-05-20 + + + + + + + + + Text + + + + + en + + + + + 2016-05-20T09:00:00Z + + + application/pdf + test_structnum.tex + LaTeX + 2016-05-20T09:00:00Z + 2016-05-20T09:00:00Z + 2016-05-20T09:00:00Z + uuid:2b6fecb9-b74a-4265-883d-138c87e7152f + uuid:0a57c455-157a-4141-8c19-6237d832fc80 + three + 1 + + + + +endstream +endobj +43 0 obj +<< /Length 653 >> +stream +/opacity1 gs +/Artifact BMC +EMC +/mi<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 148.712 657.235 Tm [<0510>]TJ +ET +EMC +/mo<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 156.75 657.235 Tm [<001E>]TJ +ET +EMC +/mi<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 167.268 657.235 Tm [<0511>]TJ +ET +EMC +/mtext<> BDC +BT +/F15 9.96264 Tf +1 0 0 1 181.505 657.235 Tm [<00620051004B0032006700690032007400690067007200420069003F0067>]TJ +ET +EMC +/Em<> BDC +BT +/F32 9.96264 Tf +1 0 0 1 249.898 657.235 Tm [<006200690060006D002B0069006D0060>51<0032>]TJ +ET +EMC +/Artifact BMC +EMC +/Artifact BMC +BT +/F15 9.96264 Tf +1 0 0 1 303.133 89.365 Tm [<0052>]TJ +ET +EMC +/Artifact BMC +EMC +endstream +endobj +42 0 obj +<< /Type /Page /Contents 43 0 R /Resources 41 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 47 0 R >> +endobj +41 0 obj +<< /ExtGState 1 0 R /Font << /F20 44 0 R /F15 45 0 R /F32 46 0 R >> >> +endobj +1 0 obj +<< /opacity1 <> >> +endobj +48 0 obj +<< /Marked true >> +endobj +49 0 obj +[ 23 0 R ] +endobj +50 0 obj +<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<> /Length 33 >> +stream +PDF standard A-4F requires a file +endstream +endobj +51 0 obj +<< /Type /Filespec /AFRelationship /Unspecified /Desc (note about PDF/A-4F) /F (readme.txt) /UF /EF<> >> +endobj +52 0 obj +<< /Names[(readme) 51 0 R] >> +endobj +6 0 obj +<< /Nums [0 [ 34 0 R 35 0 R 37 0 R 31 0 R 32 0 R] +] >> +endobj +53 0 obj +<< /Limits [(ID.002) (ID.014)]/Names [(ID.002) 21 0 R (ID.003) 24 0 R (ID.004) 25 0 R (ID.005) 26 0 R (ID.006) 27 0 R (ID.007) 28 0 R (ID.008) 31 0 R (ID.009) 32 0 R (ID.010) 33 0 R (ID.011) 34 0 R (ID.012) 35 0 R (ID.013) 37 0 R (ID.014) 38 0 R ] >> +endobj +54 0 obj +<< /Kids [53 0 R] >> +endobj +7 0 obj +<< /Artifact /NonStruct /DocumentFragment /Art /Aside /Note /H7 /H6 /H8 /H6 /H9 /H6 /H10 /H6 /Title /P /FENote /Note /Sub /Span /Em /Span /Strong /Span /title /P /part /P /section /H1 /subsection /H2 /subsubsection /H3 /paragraph /H4 /subparagraph /H5 /list /L /itemize /L /enumerate /L /description /L /quote /BlockQuote /quotation /BlockQuote /verbatim /P /item /LI /itemlabel /Lbl /itembody /LBody /footnote /Note /footnotemark /Lbl /footnotelabel /Lbl /text-unit /Part /text /P /theorem-like /Sect /codeline /Span /float /Note /figures /Sect /tables /Sect >> +endobj +55 0 obj +<< /justify <> +/inline <> + >> +endobj +9 0 obj +<< /Type /Namespace /NS (http://iso.org/pdf/ssn) >> +endobj +11 0 obj +<< /Type /Namespace /NS (http://iso.org/pdf2/ssn) >> +endobj +13 0 obj +<< /Type /Namespace /NS (http://www.w3.org/1998/Math/MathML) >> +endobj +16 0 obj +<< /title [/Title 11 0 R] /part [/Title 11 0 R] /section [/H1 11 0 R] /subsection [/H2 11 0 R] /subsubsection [/H3 11 0 R] /paragraph [/H4 11 0 R] /subparagraph [/H5 11 0 R] /list [/L 11 0 R] /itemize [/L 11 0 R] /enumerate [/L 11 0 R] /description [/L 11 0 R] /quote [/BlockQuote 9 0 R] /quotation [/BlockQuote 9 0 R] /verbatim [/P 11 0 R] /item [/LI 11 0 R] /itemlabel [/Lbl 11 0 R] /itembody [/LBody 11 0 R] /footnote [/FENote 11 0 R] /footnotemark [/Lbl 11 0 R] /footnotelabel [/Lbl 11 0 R] /text-unit [/Part 11 0 R] /text [/P 11 0 R] /theorem-like [/Sect 11 0 R] /codeline [/Sub 11 0 R] /float [/Aside 11 0 R] /figures [/Sect 11 0 R] /tables [/Sect 11 0 R] >> +endobj +15 0 obj +<< /Type /Namespace /NS (https://www.latex-project.org/ns/dflt/2022) /RoleMapNS 16 0 R >> +endobj +18 0 obj +<< /chapter [/H1 11 0 R] /section [/H2 11 0 R] /subsection [/H3 11 0 R] /subsubsection [/H4 11 0 R] /paragraph [/H5 11 0 R] /subparagraph [/H6 11 0 R] >> +endobj +17 0 obj +<< /Type /Namespace /NS (https://www.latex-project.org/ns/book/2022) /RoleMapNS 18 0 R >> +endobj +19 0 obj +<< /Type /Namespace /NS (data:,C9B55C18-275C-494E-C10F-E4B83CD03F23) >> +endobj +8 0 obj +[ 9 0 R 11 0 R 13 0 R 15 0 R 17 0 R 19 0 R ] +endobj +21 0 obj +<< /Type /StructElem /S /Document /NS 11 0 R /P 5 0 R /K 26 0 R /ID (ID.002) >> +endobj +24 0 obj +<< /Type /StructElem /S /Artifact /NS 15 0 R /P 5 0 R /ID (ID.003) >> +endobj +25 0 obj +<< /Type /StructElem /S /Artifact /NS 15 0 R /P 5 0 R /ID (ID.004) >> +endobj +26 0 obj +<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 27 0 R /ID (ID.005) >> +endobj +27 0 obj +<< /Type /StructElem /C /justify /S /text /NS 15 0 R /P 26 0 R /K [ 28 0 R ] /ID (ID.006) >> +endobj +28 0 obj +<< /Type /StructElem /C /inline /AF [30 0 R] /T /S /Formula /NS 11 0 R /P 27 0 R /K [ 33 0 R] /ID (ID.007) >> +endobj +31 0 obj +<< /Type /StructElem /S /mtext /NS 13 0 R /P 33 0 R /K [<> 32 0 R ] /ID (ID.008) >> +endobj +32 0 obj +<< /Type /StructElem /S /Em /NS 11 0 R /P 31 0 R /K <> /ID (ID.009) >> +endobj +33 0 obj +<< /Type /StructElem /S /math /NS 13 0 R /P 28 0 R /K [34 0 R 35 0 R 37 0 R 38 0 R 31 0 R] /ID (ID.010) >> +endobj +34 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 33 0 R /K <> /ID (ID.011) >> +endobj +35 0 obj +<< /Type /StructElem /A 36 0 R /S /mo /NS 13 0 R /P 33 0 R /K <> /ID (ID.012) >> +endobj +37 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 33 0 R /K <> /ID (ID.013) >> +endobj +38 0 obj +<< /Type /StructElem /A 39 0 R /S /mspace /NS 13 0 R /P 33 0 R /ID (ID.014) >> +endobj +5 0 obj +<< /Type /StructTreeRoot /Namespaces 8 0 R /IDTree 54 0 R /ClassMap 55 0 R /ParentTree 6 0 R /RoleMap 7 0 R /K 21 0 R >> +endobj +56 0 obj +[ 43 [ 460 ] 50 [ 460 ] 96 [ 422 ] 98 [ 409 ] 105 [ 332 ] 109 [ 537 ] ] +endobj +58 0 obj +<< /Subtype /CIDFontType0C /Length 1274 >> +[BINARY STREAM] +endobj +57 0 obj +<< /Type /FontDescriptor /FontName /ADNFRA+LMRoman10-Italic /Flags 4 /FontBBox [ -458 -290 1386 1125 ] /Ascent 1125 /CapHeight 683 /Descent -290 /ItalicAngle -15 /StemV 102 /XHeight 431 /FontFile3 58 0 R >> +endobj +59 0 obj +<< /Length 757 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-ADNFRA-LMRoman10-Italic-0) +%%Title: (TeX-ADNFRA-LMRoman10-Italic-0 TeX ADNFRA-LMRoman10-Italic 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (ADNFRA-LMRoman10-Italic) +/Supplement 0 +>> def +/CMapName /TeX-Identity-ADNFRA-LMRoman10-Italic def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +6 beginbfchar +<002B> <0063> +<0032> <0065> +<0060> <0072> +<0062> <0073> +<0069> <0074> +<006D> <0075> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj +46 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ADNFRA+LMRoman10-Italic /DescendantFonts [ 60 0 R ] /ToUnicode 59 0 R >> +endobj +60 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ADNFRA+LMRoman10-Italic /FontDescriptor 57 0 R /W 56 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +61 0 obj +[ 50 [ 444 ] 63 [ 556 ] 66 [ 278 ] 75 [ 833 ] 81 [ 500 500 ] 98 [ 394 ] 103 [ 333 ] 105 [ 389 ] 114 [ 722 ] 116 [ 528 ] ] +endobj +63 0 obj +<< /Subtype /CIDFontType0C /Length 1812 >> +[BINARY STREAM] +endobj +62 0 obj +<< /Type /FontDescriptor /FontName /GZYIXU+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 63 0 R >> +endobj +64 0 obj +<< /Length 833 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-GZYIXU-LMRoman10-Regular-0) +%%Title: (TeX-GZYIXU-LMRoman10-Regular-0 TeX GZYIXU-LMRoman10-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (GZYIXU-LMRoman10-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-GZYIXU-LMRoman10-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +11 beginbfchar +<0032> <0065> +<003F> <0068> +<0042> <0069> +<004B> <006D> +<0051> <006F> +<0052> <0031> +<0062> <0073> +<0067> <0020> +<0069> <0074> +<0072> <0077> +<0074> <0078> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj +45 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /GZYIXU+LMRoman10-Regular /DescendantFonts [ 65 0 R ] /ToUnicode 64 0 R >> +endobj +65 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /GZYIXU+LMRoman10-Regular /FontDescriptor 62 0 R /W 61 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +66 0 obj +[ 30 [ 778 ] 1296 [ 529 429 ] ] +endobj +68 0 obj +<< /Subtype /CIDFontType0C /Length 984 >> +[BINARY STREAM] +endobj +67 0 obj +<< /Type /FontDescriptor /FontName /NFEDYW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 68 0 R >> +endobj +69 0 obj +<< /Length 758 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-NFEDYW-LatinModernMath-Regular-0) +%%Title: (TeX-NFEDYW-LatinModernMath-Regular-0 TeX NFEDYW-LatinModernMath-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (NFEDYW-LatinModernMath-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-NFEDYW-LatinModernMath-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +3 beginbfchar +<001E> <003D> +<0510> +<0511> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj +44 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /NFEDYW+LatinModernMath-Regular /DescendantFonts [ 70 0 R ] /ToUnicode 69 0 R >> +endobj +70 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /NFEDYW+LatinModernMath-Regular /FontDescriptor 67 0 R /W 66 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +47 0 obj +<< /Type /Pages /Count 1 /Kids [ 42 0 R ] >> +endobj +71 0 obj +<< /EmbeddedFiles 52 0 R >> +endobj +72 0 obj +<< /Type /Catalog /Pages 47 0 R /Names 71 0 R /MarkInfo 48 0 R/OutputIntents 49 0 R/Lang (en)/Metadata 40 0 R/StructTreeRoot 5 0 R >> +endobj +xref +0 73 +0000000002 65535 f +0000021934 00000 n +0000000003 00000 f +0000000004 00000 f +0000000010 00000 f +0000026429 00000 n +0000022448 00000 n +0000022823 00000 n +0000024880 00000 n +0000023505 00000 n +0000000012 00000 f +0000023573 00000 n +0000000014 00000 f +0000023643 00000 n +0000000020 00000 f +0000024406 00000 n +0000023724 00000 n +0000024684 00000 n +0000024513 00000 n +0000024791 00000 n +0000000000 00000 f +0000024941 00000 n +0000000020 00000 n +0000003353 00000 n +0000025039 00000 n +0000025127 00000 n +0000025215 00000 n +0000025315 00000 n +0000025426 00000 n +0000003586 00000 n +0000003921 00000 n +0000025577 00000 n +0000025711 00000 n +0000025832 00000 n +0000025957 00000 n +0000026078 00000 n +0000004121 00000 n +0000026210 00000 n +0000026331 00000 n +0000004189 00000 n +0000004240 00000 n +0000021847 00000 n +0000021712 00000 n +0000020999 00000 n +0000035068 00000 n +0000032552 00000 n +0000029052 00000 n +0000035434 00000 n +0000021981 00000 n +0000022017 00000 n +0000022044 00000 n +0000022213 00000 n +0000022402 00000 n +0000022519 00000 n +0000022786 00000 n +0000023402 00000 n +0000026566 00000 n +0000028012 00000 n +0000026654 00000 n +0000028235 00000 n +0000029205 00000 n +0000029404 00000 n +0000031438 00000 n +0000029542 00000 n +0000031659 00000 n +0000032706 00000 n +0000032906 00000 n +0000034022 00000 n +0000032954 00000 n +0000034250 00000 n +0000035228 00000 n +0000035496 00000 n +0000035540 00000 n +trailer +<< /Size 73 /Root 72 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> +startxref +35690 +%%EOF From b7389390015458d6b34f757b784715294805d003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Wed, 30 Oct 2024 00:46:39 +0100 Subject: [PATCH 130/206] Fix c&p error in GH Actions pipeline --- .github/actions/ctan-upload/action.yaml | 2 +- .github/workflows/deploy.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/actions/ctan-upload/action.yaml b/.github/actions/ctan-upload/action.yaml index c3e0825..7de3a5b 100644 --- a/.github/actions/ctan-upload/action.yaml +++ b/.github/actions/ctan-upload/action.yaml @@ -19,7 +19,7 @@ runs: - name: Send to CTAN uses: zauguin/ctan-upload@v0.1 with: - package-name: luaotfload + package-name: luamml version: ${{ inputs.version }} author: 'Marcel Krรผger, LaTeX Project Team' uploader: ${{ inputs.uploader }} diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 5227c45..42f7d84 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -33,11 +33,11 @@ jobs: with: uploader: Dummy Name email: dryrun@example.com - filename: "build/distrib/ctan/luaotfload-ctan.zip" + filename: "build/distrib/ctan/luamml-ctan.zip" dry-run: true github: - runs-on: ubuntu-latex + runs-on: ubuntu-latest needs: - l3build steps: @@ -52,7 +52,7 @@ jobs: artifacts: "build/distrib/ctan/*.zip" prerelease: ${{ endsWith(github.ref, '-dev') }} token: ${{ secrets.GITHUB_TOKEN }} - bodyFile: ctan.ann + # bodyFile: ctan.ann ctan-upload: if: "${{ !endsWith(github.ref, '-dev') }}" @@ -74,5 +74,5 @@ jobs: with: uploader: ${{ secrets.CTAN_NAME }} email: ${{ secrets.CTAN_EMAIL }} - filename: "build/distrib/ctan/luaotfload-ctan.zip" + filename: "build/distrib/ctan/luamml-ctan.zip" dry-run: false From 06eb95d9c190e461228205b160c7ecf50220c521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Thu, 21 Nov 2024 06:54:16 +0100 Subject: [PATCH 131/206] Improve pretty-printing for text-only nodes --- luamml-xmlwriter.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/luamml-xmlwriter.lua b/luamml-xmlwriter.lua index a2b5abe..6880074 100644 --- a/luamml-xmlwriter.lua +++ b/luamml-xmlwriter.lua @@ -34,6 +34,10 @@ local function write_elem(tree, indent) return out .. '/>' end out = out .. '>' + -- Never indent the content if it's purely text. + if #tree == 1 and type(tree[1]) == 'string' then + indent = nil + end local inner_indent = indent and indent .. ' ' local is_string for _, elem in ipairs(tree) do From ff7ad4f7b4cd62a5c249f65de0849ac99b504ab6 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 29 Nov 2024 14:16:46 +0100 Subject: [PATCH 132/206] use structnum instead of label when using stashed structure --- CHANGELOG.md | 12 ++++++++++++ luamml-structelemwriter.lua | 6 ++---- 2 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..392524f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog +All notable changes to the `tagpdf` package since the +2021-04-22 will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +this project uses date-based 'snapshot' version identifiers. +## [Unreleased] + +### Changed + +- Ulrike Fischer, 2024-11-29 + luamml-structelemwriter.lua: use structnum instead of label when stashing. diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index 7c2e549..36881e1 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -81,10 +81,8 @@ local function write_elem(tree, stash) table.sort(attrs) if stash then - stash_cnt = stash_cnt + 1 - stash = '__luamml_stashed_' .. stash_cnt - tree[':struct'] = stash - stash = ', stash, label = ' .. stash + tree[':structnum'] = get_ltx().tag.get_struct_num_next() + stash = ', stash, ' end local attr_flag = i ~= 0 and ', attribute=' .. attributes[table.concat(attrs)] From 3c70bd11efe484eab046b71ec30fc52d5dd62b5a Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 29 Nov 2024 14:29:59 +0100 Subject: [PATCH 133/206] correct typo --- luamml-array.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luamml-array.lua b/luamml-array.lua index 9a7b358..f1fd7c5 100644 --- a/luamml-array.lua +++ b/luamml-array.lua @@ -54,7 +54,7 @@ end local saved_array -funcid = luatexbase.new_luafunction'__luamml_array_finalize_array:' +funcid = luatexbase.new_luafunction'__luamml_array_save_array:' token.set_lua('__luamml_array_save_array:', funcid) lua.get_functions_table()[funcid] = function() -- TODO: Error handling etc. From 13b820a339e55cd05214812302c9c0bad4eb6f66 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 29 Nov 2024 16:45:29 +0100 Subject: [PATCH 134/206] setup sockets for array patches --- luamml-patches-array.sty | 131 +++++++++++---------------------------- 1 file changed, 37 insertions(+), 94 deletions(-) diff --git a/luamml-patches-array.sty b/luamml-patches-array.sty index b08d561..9e83552 100644 --- a/luamml-patches-array.sty +++ b/luamml-patches-array.sty @@ -3,99 +3,42 @@ \lua_now:n { require'luamml-array' } -\cs_set:Npn \@classz { - \@classx - \@tempcnta \count@ - \prepnext@tok - \@addtopreamble { - \ifcase \@chnum - \hfil - \hskip 1sp - \d@llarbegin - \cs_if_eq:NNTF \d@llarbegin \begingroup { - \insert@column - \d@llarend - } { - \__luamml_array_init_col: - \insert@column - \luamml_save:nn {} {mtd} - \d@llarend - \__luamml_array_finalize_col:w 0~ - } - \do@row@strut - \hfil - \or - \hskip 1sp - \d@llarbegin - \cs_if_eq:NNTF \d@llarbegin \begingroup { - \insert@column - \d@llarend - } { - \__luamml_array_init_col: - \insert@column - \luamml_save:nn {} {mtd} - \d@llarend - \__luamml_array_finalize_col:w 1~ - } - \do@row@strut - \hfil - \or - \hfil - \hskip 1sp - \d@llarbegin - \cs_if_eq:NNTF \d@llarbegin \begingroup { - \insert@column - \d@llarend - } { - \__luamml_array_init_col: - \insert@column - \luamml_save:nn {} {mtd} - \d@llarend - \__luamml_array_finalize_col:w 2~ - } - \do@row@strut - \or - \setbox \ar@mcellbox \vbox \@startpbox { \@nextchar } - \insert@pcolumn - \@endpbox - \ar@align@mcell - \do@row@strut - \or - \vtop \@startpbox { \@nextchar } - \insert@pcolumn - \@endpbox - \do@row@strut - \or - \vbox \@startpbox { \@nextchar } - \insert@pcolumn - \@endpbox - \do@row@strut - \fi +\str_if_exist:cF { l__socket_tagsupport/math/luamml/array/save_plug_str } + { + \NewSocket{tagsupport/math/luamml/array/save}{0} + \NewSocket{tagsupport/math/luamml/array/finalize}{0} + \NewSocket{tagsupport/math/luamml/array/initcol}{0} + \NewSocket{tagsupport/math/luamml/array/savecol}{0} + \NewSocket{tagsupport/math/luamml/array/finalizecol}{1} } - \prepnext@tok -} -\IfPackageAtLeastTF {array} {2023/12/11} { - \cs_set:Npn \endarray { - \tbl_crcr:n{endarray} - \__luamml_array_save_array: - \egroup - \UseTaggingSocket{tbl/finalize} - \tbl_restore_outer_cell_data: - \egroup - \mode_if_math:T { \__luamml_array_finalize_array: } - \@arrayright - \gdef \@preamble {} - } -} { - \cs_new_eq:NN \insert@pcolumn \insert@column - \cs_set:Npn \endarray { - \crcr - \__luamml_array_save_array: - \egroup - \egroup - \mode_if_math:T { \__luamml_array_finalize_array: } - \@arrayright - \gdef \@preamble {} - } -} +\NewSocketPlug{tagsupport/math/luamml/array/save}{default} + { + \__luamml_array_save_array: + } + +\NewSocketPlug{tagsupport/math/luamml/array/finalize}{default} + { + \mode_if_math:T { \__luamml_array_finalize_array: } + } + +\NewSocketPlug{tagsupport/math/luamml/array/initcol}{default} + { + \__luamml_array_init_col: + } + +\NewSocketPlug{tagsupport/math/luamml/array/savecol}{default} + { + \luamml_save:nn {} {mtd} + } + +\NewSocketPlug{tagsupport/math/luamml/array/finalizecol}{default} + { + \__luamml_array_finalize_col:w #1~ + } + +\AssignSocketPlug{tagsupport/math/luamml/array/save}{default} +\AssignSocketPlug{tagsupport/math/luamml/array/finalize}{default} +\AssignSocketPlug{tagsupport/math/luamml/array/initcol}{default} +\AssignSocketPlug{tagsupport/math/luamml/array/savecol}{default} +\AssignSocketPlug{tagsupport/math/luamml/array/finalizecol}{default} From 872900b0766b3b35c39c28e9b1372c47d0106a4e Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 3 Dec 2024 00:27:11 +0100 Subject: [PATCH 135/206] add default plug --- luamml-patches-array.sty | 1 + 1 file changed, 1 insertion(+) diff --git a/luamml-patches-array.sty b/luamml-patches-array.sty index 9e83552..f169fd9 100644 --- a/luamml-patches-array.sty +++ b/luamml-patches-array.sty @@ -10,6 +10,7 @@ \NewSocket{tagsupport/math/luamml/array/initcol}{0} \NewSocket{tagsupport/math/luamml/array/savecol}{0} \NewSocket{tagsupport/math/luamml/array/finalizecol}{1} + \AssignSocketPlug{tagsupport/math/luamml/array/finalizecol}{noop} } \NewSocketPlug{tagsupport/math/luamml/array/save}{default} From af3b7108cce84b012f445d749f8815d12d76b5ed Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 3 Dec 2024 00:43:15 +0100 Subject: [PATCH 136/206] add plug for mbox in math --- CHANGELOG.md | 2 ++ luamml.dtx | 54 +++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 392524f..92c0112 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] ### Changed +- Ulrike Fischer, 2024-03-03 + luamml.dtx: add plug for mbox socket to correctly annotate them in math. - Ulrike Fischer, 2024-11-29 luamml-structelemwriter.lua: use structnum instead of label when stashing. diff --git a/luamml.dtx b/luamml.dtx index c45dca1..7efd364 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -93,9 +93,9 @@ % } % \end{verbatim} % produces a |TeX| element in the output instead of trying to import \TeX~as a mathematical expression. -% +% % It it possible to add a structure around the construct, stash that structure -% and then to tell \cmd{luamml_annotate:en} to insert it later inside the math. +% and then to tell \cmd{luamml_annotate:en} to insert it later inside the math. % For this the keys \texttt{struct} (which takes a label as argument) or \texttt{structnum} % (which takes a structure number) can be used. For example % \begin{verbatim} @@ -103,12 +103,12 @@ % \tagstructbegin{tag=mtext,stash}\tagmcbegin{} % \luamml_annotate:en{nucleus=true,structnum=\tag_get:n{struct_num}} % {\mbox{some~text~with~\emph{structure}}} -% \tagmcend\tagstructend +% \tagmcend\tagstructend % $ % \end{verbatim} -% Such a construction should check that the flag for structure elements has actually +% Such a construction should check that the flag for structure elements has actually % been set to avoid orphaned structures if the stashed structure is ignored. -% +% % More about the table structure is explained in an appendix. % % \section{Features \& Limitations} @@ -316,7 +316,7 @@ % written by a previous formula. Therefore this has to be called separately % for every formula or it must expand to different values to be useful. % The value is fully expanded when the file is written. -% +% % Only complete formulas get written into files (so formulas where % \cs{luamml_process:} or \cs{luamml_structelem:} are in effect). % @@ -523,11 +523,51 @@ % \end{macrocode} % \end{macro} % +% \subsection{Sockets} +% In various places luamml has to add code to kernel commands. This is done through +% sockets which are predeclared in lttagging. % +% \subsubsection{mbox} +% This socket annotates an \cs{mbox} inside math. +% We test for the socket until the release 2025-06-01. +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/mbox_plug_str } + { + \NewSocket{tagsupport/math/luamml/mbox}{2} + \NewSocketPlug{tagsupport/math/luamml/mbox}{default}{#2} + \AssignSocketPlug{tagsupport/math/luamml/mbox}{default} + } +%<*luatex> +\NewSocketPlug{tagsupport/math/luamml/mbox}{luamml} + { + \bool_lazy_and:nnTF + { \mode_if_math_p: } + { \int_if_odd_p:n { \int_div_truncate:nn { \l__luamml_flag_int } { 8 } } } + { + \tag_struct_begin:n + { + tag=mtext, + stash, + } + \tag_mc_begin:n {} + \luamml_annotate:en + { + nucleus = true, + structnum=\tag_get:n{struct_num} + } + { #2 } + \tag_mc_end: + \tag_struct_end: + } + { #2 } + } +\AssignSocketPlug{tagsupport/math/luamml/mbox}{luamml} +% +% \end{macrocode} % \subsection{Patching} % For some packages, we ship with patches to make them more compatible and to % demonstrate how other code can be patched to work with \texttt{luamml}. -% +% % These are either loaded directly if the packages are loaded or delayed using % \LaTeX's hook system otherwise. % \begin{macro}{\__luamml_patch_package:nn, \__luamml_patch_package:n} From 957c8ff8033ec63900bd873aa151d2d11f6fa5ea Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 3 Dec 2024 14:19:15 +0100 Subject: [PATCH 137/206] rename socket --- luamml.dtx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/luamml.dtx b/luamml.dtx index 7efd364..5134062 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -528,17 +528,17 @@ % sockets which are predeclared in lttagging. % % \subsubsection{mbox} -% This socket annotates an \cs{mbox} inside math. +% This socket annotates an \cs{hbox} inside box command use in math. % We test for the socket until the release 2025-06-01. % \begin{macrocode} -\str_if_exist:cF { l__socket_tagsupport/math/luamml/mbox_plug_str } +\str_if_exist:cF { l__socket_tagsupport/math/luamml/hbox_plug_str } { - \NewSocket{tagsupport/math/luamml/mbox}{2} - \NewSocketPlug{tagsupport/math/luamml/mbox}{default}{#2} - \AssignSocketPlug{tagsupport/math/luamml/mbox}{default} + \NewSocket{tagsupport/math/luamml/hbox}{2} + \NewSocketPlug{tagsupport/math/luamml/hbox}{default}{#2} + \AssignSocketPlug{tagsupport/math/luamml/hbox}{default} } %<*luatex> -\NewSocketPlug{tagsupport/math/luamml/mbox}{luamml} +\NewSocketPlug{tagsupport/math/luamml/hbox}{luamml} { \bool_lazy_and:nnTF { \mode_if_math_p: } @@ -561,7 +561,7 @@ } { #2 } } -\AssignSocketPlug{tagsupport/math/luamml/mbox}{luamml} +\AssignSocketPlug{tagsupport/math/luamml/hbox}{luamml} % % \end{macrocode} % \subsection{Patching} From eb4dd9561c5573e01fb64f1f5607be610557698a Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 3 Dec 2024 16:33:37 +0100 Subject: [PATCH 138/206] handle text command as in latex-lab --- luamml-patches-amstext.sty | 56 +++++++++++++++----------------------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/luamml-patches-amstext.sty b/luamml-patches-amstext.sty index 97b1b1f..a5ea9b7 100644 --- a/luamml-patches-amstext.sty +++ b/luamml-patches-amstext.sty @@ -1,37 +1,25 @@ \ProvidesExplPackage {luamml-patches-amstext} {2024-10-30} {0.2.0} {Feel free to add a description here} -\int_new:N \g__luamml_amsmath_text_struct_int -\cs_set:Npn \textdef@ #1 #2 #3 { - \int_if_odd:nTF { \int_div_truncate:nn { \l__luamml_flag_int } { 8 } } { - \int_gincr:N \g__luamml_amsmath_text_struct_int - \tag_struct_begin:n { - tag = mtext/mathml, - stash, - label = __luamml_amsmath_text_ \int_use:N \g__luamml_amsmath_text_struct_int - } - \tag_mc_begin:n { - tag = mtext - } - \AnnotateFormula { - nucleus = true, - struct = "__luamml_amsmath_text_ \int_use:N \g__luamml_amsmath_text_struct_int" - } - } { - \use:n - } - { - \hbox { - { - \everymath {#1} - \let \f@size #2 - \selectfont - #3 - } - } - } - \int_if_odd:nT { \int_div_truncate:nn { \l__luamml_flag_int } { 8 } } { - \tag_mc_end: - \tag_struct_end: - } -} +% This is the same definition as in latex-lab-amsmath. It can go with the +% 2025-06-01 release. + +\sys_if_engine_luatex:T + { + \def\text@#1{ + \tag_socket_use:nnn {math/luamml/hbox}{} + {{% + \ifcase\mathstyle + \hbox{{#1}}\or + \hbox{{#1}}\or + \hbox{{#1}}\or + \hbox{{#1}}\or + \hbox{{\let\f@size\sf@size\selectfont#1}}\or + \hbox{{\let\f@size\sf@size\selectfont#1}}\or + \hbox{{\let\f@size\ssf@size\selectfont#1}}\or + \hbox{{\let\f@size\ssf@size\selectfont#1}}\or + \ERROR + \fi + \check@mathfonts + }}} + } From a3e75978e659f8b7ed52cf99d1b8332760b79a07 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 3 Dec 2024 17:12:11 +0100 Subject: [PATCH 139/206] update testfiles --- testfiles-lua/cases.mlt | 27 +- testfiles-lua/test_struct.pvt | 26 +- testfiles-lua/test_struct.tpf | 1485 +++++++++++++++++---------------- 3 files changed, 781 insertions(+), 757 deletions(-) diff --git a/testfiles-lua/cases.mlt b/testfiles-lua/cases.mlt index 3db10ea..ff6f1a5 100644 --- a/testfiles-lua/cases.mlt +++ b/testfiles-lua/cases.mlt @@ -1,15 +1,21 @@ \DocumentMetadata{ uncompress, pdfversion = 2.0, - testphase = phase-I, + testphase = {phase-III,table,math}, } \input{regression-test} \documentclass{article} -\usepackage[l3build]{luamml-demo} +\usepackage{unicode-math} \begin{document} -\tagstructbegin{tag=Document} -\LuaMMLTagAF{} { +\ExplSyntaxOn +\luamml_set_filename:n { + \jobname .mml + } +\luamml_process: +\luamml_begin_single_file: +\ExplSyntaxOff + \[ \left(\begin{matrix} 1 & 0 & 0 \\ @@ -22,18 +28,17 @@ 2 & \mbox{else} \end{cases} \] -} -\LuaMMLTagAF{} { + \[ x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}. \] -} -\LuaMMLTagAF{} { + \[ \sum_a\underline c\dot bc' \] -} -Es gilt \LuaMMLTagAF{}{$\sin(x)-\sin(x+2\pi)=0$}. -\tagstructend +Es gilt $\sin(x)-\sin(x+2\pi)=0$. +\ExplSyntaxOn +\luamml_end_single_file: +\ExplSyntaxOff \end{document} diff --git a/testfiles-lua/test_struct.pvt b/testfiles-lua/test_struct.pvt index c1a0f8c..793a989 100644 --- a/testfiles-lua/test_struct.pvt +++ b/testfiles-lua/test_struct.pvt @@ -4,24 +4,16 @@ \DocumentMetadata{ uncompress, pdfversion = 2.0, - testphase = phase-I, + testphase = {phase-III,math,table}, } \input{regression-test} \documentclass{article} -\usepackage[structelem]{luamml-demo} - \usepackage{unicode-math} - +\tagpdfsetup{math/mathml/structelem} \begin{document} -\tagstructbegin{tag=Document} -\tagstructbegin{tag=P} -\tagmcbegin{tag=P} hello -\tagmcend -\tagstructend -\LuaMMLTagAF{} { \[ \begin{pmatrix} 1 & 0 & 0 \\ @@ -34,26 +26,22 @@ hello 2 & \text{else} \end{cases} \] -} -\LuaMMLTagAF{} { + \[ x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}. \] -} -\LuaMMLTagAF{} { + \[ \sum_a\underline c\dot bc' \] -} -\LuaMMLTagAF{} { \begin{align} abc&=def & e^{\mathrm{i}\pi}&=-1\\ \Big(1+2&=3\Big)\\ 5 \end{align} -} -Es gilt \LuaMMLTagAF{}{$\sin(x)-\sin(x+2\pi)=0$}. -\tagstructend + +Es gilt $\sin(x)-\sin(x+2\pi)=0$. + \end{document} diff --git a/testfiles-lua/test_struct.tpf b/testfiles-lua/test_struct.tpf index c895313..520c6ad 100644 --- a/testfiles-lua/test_struct.tpf +++ b/testfiles-lua/test_struct.tpf @@ -1,110 +1,144 @@ %PDF-2.0 %ฬีมิลุะฤฦ -49 0 obj -<< /O/NSO/NS 13 0 R/displaystyle(true)/scriptlevel(0) >> -endobj -52 0 obj -<< /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0.278em) >> -endobj -80 0 obj -<< /O/NSO/NS 13 0 R/display(block) >> -endobj -83 0 obj -<< /O/NSO/NS 13 0 R/fence(true)/lspace(0)/rspace(0)/symmetric(true) >> -endobj -85 0 obj -<< /O/NSO/NS 13 0 R/width(-4.981pt) >> -endobj -87 0 obj -<< /O/NSO/NS 13 0 R/lspace(+4.981pt)/width(+9.963pt) >> -endobj -102 0 obj -<< /O/NSO/NS 13 0 R/width(1.196pt) >> -endobj -103 0 obj -<> +22 0 obj +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 130 >> stream -(100010001)={1ifย ๐‘Ž=๐‘2else + ๐‘Ž = ๐‘ endstream endobj +23 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-1) /F (mathml-1.xml) /UF /EF<> >> +endobj 24 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 496 >> +stream + ๐‘ฅ = โˆ’ ๐‘ ยฑ ๐‘ 2 โˆ’ 4 ๐‘Ž ๐‘ 2 ๐‘Ž . +endstream endobj -112 0 obj +25 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-2) /F (mathml-2.xml) /UF /EF<> >> +endobj +26 0 obj +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 333 >> +stream + โˆ‘ ๐‘Ž ๐‘ _ ๐‘ . ๐‘ โ€ฒ +endstream +endobj +27 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-3) /F (mathml-3.xml) /UF /EF<> >> +endobj +28 0 obj +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 1062 >> +stream + ๐‘Ž ๐‘ ๐‘ = ๐‘‘ ๐‘’ ๐‘“ ๐‘’ i ๐œ‹ = โˆ’ 1 ( 1 + 2 = 3 ) 5 +endstream +endobj +29 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-4) /F (mathml-4.xml) /UF /EF<> >> +endobj +30 0 obj +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 530 >> +stream + sin ( ๐‘ฅ ) โˆ’ sin ( ๐‘ฅ + 2 ๐œ‹ ) = 0 +endstream +endobj +31 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-5) /F (mathml-5.xml) /UF /EF<> >> +endobj +38 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 172 >> +stream +\begin {equation*}\begin {pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end {pmatrix} = \begin {cases} 1 & \text {if $a=b$} \\ 2 & \text {else} \end {cases}\end {equation*} +endstream +endobj +39 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile1.tex) /UF /EF<> >> +endobj +64 0 obj +<< /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0.278em) >> +endobj +72 0 obj +<< /O/NSO/NS 13 0 R/display(block) >> +endobj +75 0 obj +<< /O/NSO/NS 13 0 R/fence(true)/lspace(0)/rspace(0)/symmetric(true) >> +endobj +77 0 obj +<< /O/NSO/NS 13 0 R/width(-4.981pt) >> +endobj +79 0 obj +<< /O/NSO/NS 13 0 R/lspace(+4.981pt)/width(+9.963pt) >> +endobj +94 0 obj +<< /O/NSO/NS 13 0 R/width(1.196pt) >> +endobj +97 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 73 >> +stream +\begin {equation*}x = \frac {-b \pm \sqrt {b^2-4ac}}{2a}.\end {equation*} +endstream +endobj +98 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile2.tex) /UF /EF<> >> +endobj +105 0 obj << /O/NSO/NS 13 0 R/lspace(0)/rspace(0.222em) >> endobj -115 0 obj +108 0 obj << /O/NSO/NS 13 0 R/lspace(0.222em)/rspace(0.222em) >> endobj -129 0 obj +122 0 obj << /O/NSO/NS 13 0 R/lspace(0)/rspace(0) >> endobj -130 0 obj -<> +125 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 61 >> stream -๐‘ฅ=โˆ’๐‘ยฑ๐‘2โˆ’4๐‘Ž๐‘2๐‘Ž. +\begin {equation*}\sum _a\underline c\dot bc'\end {equation*} endstream endobj -104 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> +126 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile3.tex) /UF /EF<> >> endobj -136 0 obj +130 0 obj << /O/NSO/NS 13 0 R/lspace(0)/movablelimits(true)/rspace(0.167em) >> endobj -144 0 obj +138 0 obj << /O/NSO/NS 13 0 R/stretchy(true) >> endobj -148 0 obj +142 0 obj << /O/NSO/NS 13 0 R/mathvariant(normal) >> endobj -149 0 obj -<> +145 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 85 >> stream -โˆ‘๐‘Ž๐‘_๐‘.๐‘โ€ฒ +\begin {align}abc&=def & e^{\mathrm {i}\pi }&=-1\\ \Big (1+2&=3\Big )\\ 5\end {align} endstream endobj -131 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> +146 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile4.tex) /UF /EF<> >> endobj -171 0 obj +166 0 obj << /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0) >> endobj -176 0 obj +172 0 obj << /O/NSO/NS 13 0 R/fence(true)/lspace(0)/maxsize(17.861pt)/minsize(17.861pt)/rspace(0)/symmetric(true) >> endobj -199 0 obj +197 0 obj << /O/NSO/NS 13 0 R/columnalign(right left right left)/columnspacing(0 .8em 0)/displaystyle(true) >> endobj -202 0 obj -<< /O/NSO/NS 13 0 R/intent(:equationlabel) >> -endobj -210 0 obj -<> +204 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 27 >> stream -(1)๐‘Ž๐‘๐‘=๐‘‘๐‘’๐‘“๐‘’i๐œ‹=โˆ’1(2)(1+2=3)(3)5 +$\sin (x)-\sin (x+2\pi )=0$ endstream endobj -150 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> +205 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile5.tex) /UF /EF<> >> endobj -216 0 obj +209 0 obj << /O/NSO/NS 13 0 R/lspace(0)/rspace(0)/stretchy(false) >> endobj -229 0 obj -<> -stream -sin(๐‘ฅ)โˆ’sin(๐‘ฅ+2๐œ‹)=0 -endstream -endobj -211 0 obj -<< /Type /Filespec /AFRelationship /Supplement /F (test.xml) /UF /EF<> >> -endobj -230 0 obj +222 0 obj << /Type /Metadata /Subtype /XML /Length 11693 >> stream @@ -338,13 +372,13 @@ stream endstream endobj -233 0 obj -<< /Length 7848 >> +225 0 obj +<< /Length 8308 >> stream /opacity1 gs /Artifact BMC EMC -/P<> BDC +/text<> BDC BT /F15 9.96264 Tf 1 0 0 1 148.712 657.235 Tm [<003F0032004800480051>]TJ @@ -358,9 +392,9 @@ BT 1 0 0 1 244.283 610.196 Tm [<09C7>]TJ ET EMC -/Artifact BMC +/Formula<> BDC EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 253.001 635.915 Tm [<0012>]TJ @@ -368,7 +402,7 @@ ET EMC /Artifact BMC EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 267.945 635.915 Tm [<0011>]TJ @@ -376,7 +410,7 @@ ET EMC /Artifact BMC EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 282.889 635.915 Tm [<0011>]TJ @@ -384,7 +418,11 @@ ET EMC /Artifact BMC EMC -/mn<> BDC +/Formula<> BDC +EMC +/Artifact BMC +EMC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 253.001 623.96 Tm [<0011>]TJ @@ -392,7 +430,7 @@ ET EMC /Artifact BMC EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 267.945 623.96 Tm [<0012>]TJ @@ -400,7 +438,7 @@ ET EMC /Artifact BMC EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 282.889 623.96 Tm [<0011>]TJ @@ -408,7 +446,11 @@ ET EMC /Artifact BMC EMC -/mn<> BDC +/Formula<> BDC +EMC +/Artifact BMC +EMC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 253.001 612.005 Tm [<0011>]TJ @@ -416,7 +458,7 @@ ET EMC /Artifact BMC EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 267.945 612.005 Tm [<0011>]TJ @@ -424,7 +466,7 @@ ET EMC /Artifact BMC EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 282.889 612.005 Tm [<0012>]TJ @@ -432,7 +474,7 @@ ET EMC /Artifact BMC EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 287.87 627.612 Tm [<09CC>]TJ @@ -440,13 +482,13 @@ BT 1 0 0 1 287.87 610.196 Tm [<09CA>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 299.355 623.861 Tm [<001E>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 309.873 623.861 Tm [<09D3>]TJ @@ -454,7 +496,7 @@ ET EMC /Artifact BMC EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 318.859 630.655 Tm [<0012>]TJ @@ -462,25 +504,25 @@ ET EMC /Artifact BMC EMC -/mtext<> BDC +/mtext<> BDC BT /F15 9.96264 Tf 1 0 0 1 333.803 630.655 Tm [<004200370067>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 342.939 630.655 Tm [<0510>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 350.977 630.655 Tm [<001E>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 361.495 630.655 Tm [<0511>]TJ @@ -488,7 +530,7 @@ ET EMC /Artifact BMC EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 318.859 616.309 Tm [<0013>]TJ @@ -496,7 +538,7 @@ ET EMC /Artifact BMC EMC -/mtext<> BDC +/mtext<> BDC BT /F15 9.96264 Tf 1 0 0 1 333.803 616.309 Tm [<0032004800620032>]TJ @@ -504,37 +546,37 @@ ET EMC /Artifact BMC EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 259.389 584.175 Tm [<0527>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 267.855 584.175 Tm [<001E>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 279.569 590.92 Tm [<0A37>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 287.319 590.92 Tm [<0511>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 293.947 590.92 Tm [<0A3B>]TJ ET EMC -/Artifact BMC +/Formula<> BDC BT /F20 9.96264 Tf 1 0 0 1 303.912 599.651 Tm [<0C05>]TJ @@ -544,109 +586,109 @@ q [] 0 d 0 J 0.398 w 0 0 m 35.684 0 l S Q EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 312.21 590.92 Tm [<0511>]TJ ET EMC -/mn<> BDC +/mn<> BDC BT /F21 6.97385 Tf 1 0 0 1 316.624 593.799 Tm [<03F5>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 323.364 590.92 Tm [<0A37>]TJ ET EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 333.329 590.92 Tm [<0015>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 338.31 590.92 Tm [<0510>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 343.58 590.92 Tm [<0512>]TJ ET EMC -/Artifact BMC +/Formula<> BDC q 1 0 0 1 279.569 586.666 cm [] 0 d 0 J 0.398 w 0 0 m 68.325 0 l S Q EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 308.605 577.341 Tm [<0013>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 313.587 577.341 Tm [<0510>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 349.089 584.175 Tm [<000F>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 289.257 554.287 Tm [<0C02>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F21 6.97385 Tf 1 0 0 1 294.289 543.827 Tm [<057C>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 305.304 554.287 Tm [<0512>]TJ ET EMC -/Artifact BMC +/Formula<> BDC q 1 0 0 1 305.304 552.783 cm [] 0 d 0 J 0.398 w 0 0 m 4.314 0 l S Q EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 313.902 556.718 Tm [<06FE>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 309.618 554.287 Tm [<0511>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 314.031 554.287 Tm [<0512>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F21 6.97385 Tf 1 0 0 1 318.594 557.904 Tm [<0BA5>]TJ @@ -654,19 +696,21 @@ ET EMC /Artifact BMC EMC -/mi<> BDC +/Formula<> BDC +EMC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 231.386 514.437 Tm [<0510>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 236.656 514.437 Tm [<0511>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 241.07 514.437 Tm [<0512>]TJ @@ -674,25 +718,25 @@ ET EMC /Artifact BMC EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 248.151 514.437 Tm [<001E>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 258.669 514.437 Tm [<0513>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 264.089 514.437 Tm [<0514>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 268.731 514.437 Tm [<0515>]TJ @@ -700,19 +744,19 @@ ET EMC /Artifact BMC EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 356.481 514.437 Tm [<0514>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F32 6.97385 Tf 1 0 0 1 361.124 518.053 Tm [<0042>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F21 6.97385 Tf 1 0 0 1 363.377 518.053 Tm [<11CE>]TJ @@ -720,49 +764,55 @@ ET EMC /Artifact BMC EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 371.36 514.437 Tm [<001E>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 381.879 514.437 Tm [<0A37>]TJ ET EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 389.63 514.437 Tm [<0012>]TJ ET EMC /Artifact BMC +EMC +/Lbl<> BDC BT /F15 9.96264 Tf 1 0 0 1 464.747 514.437 Tm [<005500520056>]TJ ET EMC -/mo<> BDC +/Artifact BMC +EMC +/Formula<> BDC +EMC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 216.637 493.954 Tm [<0997>]TJ ET EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 223.242 493.954 Tm [<0012>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 230.437 493.954 Tm [<000C>]TJ ET EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 240.402 493.954 Tm [<0013>]TJ @@ -770,134 +820,153 @@ ET EMC /Artifact BMC EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 248.151 493.954 Tm [<001E>]TJ ET EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 258.669 493.954 Tm [<0014>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 263.65 493.954 Tm [<0998>]TJ ET EMC /Artifact BMC +EMC +/Lbl<> BDC BT /F15 9.96264 Tf 1 0 0 1 464.747 493.954 Tm [<0055006B0056>]TJ ET EMC -/mn<> BDC +/Artifact BMC +EMC +/Formula<> BDC +EMC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 240.402 473.67 Tm [<0016>]TJ ET EMC /Artifact BMC +EMC +/Lbl<> BDC BT /F15 9.96264 Tf 1 0 0 1 464.747 473.67 Tm [<0055006A0056>]TJ +ET +EMC +/text<> BDC +BT +/F15 9.96264 Tf 1 0 0 1 148.712 451.752 Tm [<003100620067003B0042004800690067>]TJ ET EMC -/mi<> BDC +/Formula<> BDC +EMC +/mi<> BDC BT /F15 9.96264 Tf 1 0 0 1 180.453 451.752 Tm [<00620042004D>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 192.687 451.752 Tm [<0009>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 196.563 451.752 Tm [<0527>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 202.262 451.752 Tm [<000A>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 208.351 451.752 Tm [<0A37>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F15 9.96264 Tf 1 0 0 1 218.316 451.752 Tm [<00620042004D>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 230.55 451.752 Tm [<0009>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 234.425 451.752 Tm [<0527>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 242.338 451.752 Tm [<000C>]TJ ET EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 252.303 451.752 Tm [<0013>]TJ ET EMC -/mi<> BDC +/mi<> BDC BT /F20 9.96264 Tf 1 0 0 1 257.284 451.752 Tm [<117A>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 263.212 451.752 Tm [<000A>]TJ ET EMC -/mo<> BDC +/mo<> BDC BT /F20 9.96264 Tf 1 0 0 1 269.854 451.752 Tm [<001E>]TJ ET EMC -/mn<> BDC +/mn<> BDC BT /F20 9.96264 Tf 1 0 0 1 280.373 451.752 Tm [<0011>]TJ ET EMC /Artifact BMC +EMC +/text<> BDC BT /F15 9.96264 Tf 1 0 0 1 285.354 451.752 Tm [<0058>]TJ ET EMC /Artifact BMC +EMC +/Artifact BMC BT /F15 9.96264 Tf 1 0 0 1 303.133 89.365 Tm [<0052>]TJ @@ -907,40 +976,52 @@ EMC EMC endstream endobj -232 0 obj -<< /Type /Page /Contents 233 0 R /Resources 231 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 238 0 R >> +224 0 obj +<< /Type /Page /Contents 225 0 R /Resources 223 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 230 0 R >> endobj -231 0 obj -<< /ExtGState 1 0 R /Font << /F15 234 0 R /F20 235 0 R /F21 236 0 R /F32 237 0 R >> >> +223 0 obj +<< /ExtGState 1 0 R /Font << /F15 226 0 R /F20 227 0 R /F21 228 0 R /F32 229 0 R >> >> endobj 1 0 obj << /opacity1 <> >> endobj -239 0 obj +231 0 obj << /Marked true >> endobj +232 0 obj +<< /Names[(l3ef0001) 23 0 R (l3ef0002) 25 0 R (l3ef0003) 27 0 R (l3ef0004) 29 0 R (l3ef0005) 31 0 R] >> +endobj 6 0 obj -<< /Nums [0 [ 23 0 R 82 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 41 0 R 43 0 R 93 0 R 94 0 R 96 0 R 45 0 R 54 0 R 56 0 R 57 0 R 58 0 R 72 0 R 74 0 R 107 0 R 108 0 R 111 0 R 113 0 R 114 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 126 0 R 127 0 R 128 0 R 135 0 R 137 0 R 139 0 R 143 0 R 142 0 R 146 0 R 147 0 R 153 0 R 154 0 R 155 0 R 158 0 R 159 0 R 160 0 R 161 0 R 164 0 R 166 0 R 167 0 R 170 0 R 172 0 R 173 0 R 175 0 R 177 0 R 178 0 R 179 0 R 182 0 R 183 0 R 184 0 R 190 0 R 214 0 R 215 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R] +<< /Nums [0 [ 35 0 R 74 0 R 37 0 R 41 0 R 43 0 R 45 0 R 37 0 R 47 0 R 49 0 R 51 0 R 37 0 R 53 0 R 55 0 R 57 0 R 85 0 R 86 0 R 88 0 R 59 0 R 60 0 R 62 0 R 63 0 R 65 0 R 68 0 R 69 0 R 100 0 R 101 0 R 104 0 R 106 0 R 107 0 R 96 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 96 0 R 119 0 R 120 0 R 121 0 R 129 0 R 131 0 R 133 0 R 124 0 R 137 0 R 136 0 R 140 0 R 141 0 R 144 0 R 148 0 R 149 0 R 150 0 R 153 0 R 154 0 R 155 0 R 156 0 R 159 0 R 161 0 R 162 0 R 165 0 R 167 0 R 168 0 R 169 0 R 144 0 R 171 0 R 173 0 R 174 0 R 175 0 R 178 0 R 179 0 R 180 0 R 185 0 R 144 0 R 187 0 R 194 0 R 202 0 R 203 0 R 207 0 R 208 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 202 0 R] ] >> endobj -240 0 obj -<< /Limits [(ID.0002) (ID.0051)]/Names [(ID.0002) 21 0 R (ID.0003) 22 0 R (ID.0004) 23 0 R (ID.0005) 25 0 R (ID.0006) 26 0 R (ID.0007) 27 0 R (ID.0008) 28 0 R (ID.0009) 29 0 R (ID.0010) 30 0 R (ID.0011) 31 0 R (ID.0012) 32 0 R (ID.0013) 33 0 R (ID.0014) 34 0 R (ID.0015) 35 0 R (ID.0016) 36 0 R (ID.0017) 37 0 R (ID.0018) 38 0 R (ID.0019) 39 0 R (ID.0020) 40 0 R (ID.0021) 41 0 R (ID.0022) 42 0 R (ID.0023) 43 0 R (ID.0024) 44 0 R (ID.0025) 45 0 R (ID.0026) 46 0 R (ID.0027) 47 0 R (ID.0028) 48 0 R (ID.0029) 50 0 R (ID.0030) 51 0 R (ID.0031) 53 0 R (ID.0032) 54 0 R (ID.0033) 55 0 R (ID.0034) 56 0 R (ID.0035) 57 0 R (ID.0036) 58 0 R (ID.0037) 59 0 R (ID.0038) 60 0 R (ID.0039) 61 0 R (ID.0040) 62 0 R (ID.0041) 63 0 R (ID.0042) 64 0 R (ID.0043) 65 0 R (ID.0044) 66 0 R (ID.0045) 67 0 R (ID.0046) 68 0 R (ID.0047) 69 0 R (ID.0048) 70 0 R (ID.0049) 71 0 R (ID.0050) 72 0 R (ID.0051) 73 0 R ] >> +233 0 obj +<< /Limits [(ID.0002) (ID.0051)]/Names [(ID.0002) 21 0 R (ID.0003) 32 0 R (ID.0004) 33 0 R (ID.0005) 34 0 R (ID.0006) 35 0 R (ID.0007) 36 0 R (ID.0008) 37 0 R (ID.0009) 40 0 R (ID.0010) 41 0 R (ID.0011) 42 0 R (ID.0012) 43 0 R (ID.0013) 44 0 R (ID.0014) 45 0 R (ID.0015) 46 0 R (ID.0016) 47 0 R (ID.0017) 48 0 R (ID.0018) 49 0 R (ID.0019) 50 0 R (ID.0020) 51 0 R (ID.0021) 52 0 R (ID.0022) 53 0 R (ID.0023) 54 0 R (ID.0024) 55 0 R (ID.0025) 56 0 R (ID.0026) 57 0 R (ID.0027) 58 0 R (ID.0028) 59 0 R (ID.0029) 60 0 R (ID.0030) 61 0 R (ID.0031) 62 0 R (ID.0032) 63 0 R (ID.0033) 65 0 R (ID.0034) 66 0 R (ID.0035) 67 0 R (ID.0036) 68 0 R (ID.0037) 69 0 R (ID.0038) 70 0 R (ID.0039) 71 0 R (ID.0040) 73 0 R (ID.0041) 74 0 R (ID.0042) 76 0 R (ID.0043) 78 0 R (ID.0044) 80 0 R (ID.0045) 81 0 R (ID.0046) 82 0 R (ID.0047) 83 0 R (ID.0048) 84 0 R (ID.0049) 85 0 R (ID.0050) 86 0 R (ID.0051) 87 0 R ] >> endobj -241 0 obj -<< /Limits [(ID.0052) (ID.0101)]/Names [(ID.0052) 74 0 R (ID.0053) 75 0 R (ID.0054) 76 0 R (ID.0055) 77 0 R (ID.0056) 78 0 R (ID.0057) 79 0 R (ID.0058) 81 0 R (ID.0059) 82 0 R (ID.0060) 84 0 R (ID.0061) 86 0 R (ID.0062) 88 0 R (ID.0063) 89 0 R (ID.0064) 90 0 R (ID.0065) 91 0 R (ID.0066) 92 0 R (ID.0067) 93 0 R (ID.0068) 94 0 R (ID.0069) 95 0 R (ID.0070) 96 0 R (ID.0071) 97 0 R (ID.0072) 98 0 R (ID.0073) 99 0 R (ID.0074) 100 0 R (ID.0075) 101 0 R (ID.0076) 105 0 R (ID.0077) 106 0 R (ID.0078) 107 0 R (ID.0079) 108 0 R (ID.0080) 109 0 R (ID.0081) 110 0 R (ID.0082) 111 0 R (ID.0083) 113 0 R (ID.0084) 114 0 R (ID.0085) 116 0 R (ID.0086) 117 0 R (ID.0087) 118 0 R (ID.0088) 119 0 R (ID.0089) 120 0 R (ID.0090) 121 0 R (ID.0091) 122 0 R (ID.0092) 123 0 R (ID.0093) 124 0 R (ID.0094) 125 0 R (ID.0095) 126 0 R (ID.0096) 127 0 R (ID.0097) 128 0 R (ID.0098) 132 0 R (ID.0099) 133 0 R (ID.0100) 134 0 R (ID.0101) 135 0 R ] >> +234 0 obj +<< /Limits [(ID.0052) (ID.0101)]/Names [(ID.0052) 88 0 R (ID.0053) 89 0 R (ID.0054) 90 0 R (ID.0055) 91 0 R (ID.0056) 92 0 R (ID.0057) 93 0 R (ID.0058) 95 0 R (ID.0059) 96 0 R (ID.0060) 99 0 R (ID.0061) 100 0 R (ID.0062) 101 0 R (ID.0063) 102 0 R (ID.0064) 103 0 R (ID.0065) 104 0 R (ID.0066) 106 0 R (ID.0067) 107 0 R (ID.0068) 109 0 R (ID.0069) 110 0 R (ID.0070) 111 0 R (ID.0071) 112 0 R (ID.0072) 113 0 R (ID.0073) 114 0 R (ID.0074) 115 0 R (ID.0075) 116 0 R (ID.0076) 117 0 R (ID.0077) 118 0 R (ID.0078) 119 0 R (ID.0079) 120 0 R (ID.0080) 121 0 R (ID.0081) 123 0 R (ID.0082) 124 0 R (ID.0083) 127 0 R (ID.0084) 128 0 R (ID.0085) 129 0 R (ID.0086) 131 0 R (ID.0087) 132 0 R (ID.0088) 133 0 R (ID.0089) 134 0 R (ID.0090) 135 0 R (ID.0091) 136 0 R (ID.0092) 137 0 R (ID.0093) 139 0 R (ID.0094) 140 0 R (ID.0095) 141 0 R (ID.0096) 143 0 R (ID.0097) 144 0 R (ID.0098) 147 0 R (ID.0099) 148 0 R (ID.0100) 149 0 R (ID.0101) 150 0 R ] >> endobj -242 0 obj -<< /Limits [(ID.0102) (ID.0151)]/Names [(ID.0102) 137 0 R (ID.0103) 138 0 R (ID.0104) 139 0 R (ID.0105) 140 0 R (ID.0106) 141 0 R (ID.0107) 142 0 R (ID.0108) 143 0 R (ID.0109) 145 0 R (ID.0110) 146 0 R (ID.0111) 147 0 R (ID.0112) 151 0 R (ID.0113) 152 0 R (ID.0114) 153 0 R (ID.0115) 154 0 R (ID.0116) 155 0 R (ID.0117) 156 0 R (ID.0118) 157 0 R (ID.0119) 158 0 R (ID.0120) 159 0 R (ID.0121) 160 0 R (ID.0122) 161 0 R (ID.0123) 162 0 R (ID.0124) 163 0 R (ID.0125) 164 0 R (ID.0126) 165 0 R (ID.0127) 166 0 R (ID.0128) 167 0 R (ID.0129) 168 0 R (ID.0130) 169 0 R (ID.0131) 170 0 R (ID.0132) 172 0 R (ID.0133) 173 0 R (ID.0134) 174 0 R (ID.0135) 175 0 R (ID.0136) 177 0 R (ID.0137) 178 0 R (ID.0138) 179 0 R (ID.0139) 180 0 R (ID.0140) 181 0 R (ID.0141) 182 0 R (ID.0142) 183 0 R (ID.0143) 184 0 R (ID.0144) 185 0 R (ID.0145) 186 0 R (ID.0146) 187 0 R (ID.0147) 188 0 R (ID.0148) 189 0 R (ID.0149) 190 0 R (ID.0150) 191 0 R (ID.0151) 192 0 R ] >> +235 0 obj +<< /Limits [(ID.0102) (ID.0151)]/Names [(ID.0102) 151 0 R (ID.0103) 152 0 R (ID.0104) 153 0 R (ID.0105) 154 0 R (ID.0106) 155 0 R (ID.0107) 156 0 R (ID.0108) 157 0 R (ID.0109) 158 0 R (ID.0110) 159 0 R (ID.0111) 160 0 R (ID.0112) 161 0 R (ID.0113) 162 0 R (ID.0114) 163 0 R (ID.0115) 164 0 R (ID.0116) 165 0 R (ID.0117) 167 0 R (ID.0118) 168 0 R (ID.0119) 169 0 R (ID.0120) 170 0 R (ID.0121) 171 0 R (ID.0122) 173 0 R (ID.0123) 174 0 R (ID.0124) 175 0 R (ID.0125) 176 0 R (ID.0126) 177 0 R (ID.0127) 178 0 R (ID.0128) 179 0 R (ID.0129) 180 0 R (ID.0130) 181 0 R (ID.0131) 182 0 R (ID.0132) 183 0 R (ID.0133) 184 0 R (ID.0134) 185 0 R (ID.0135) 186 0 R (ID.0136) 187 0 R (ID.0137) 188 0 R (ID.0138) 189 0 R (ID.0139) 190 0 R (ID.0140) 191 0 R (ID.0141) 192 0 R (ID.0142) 193 0 R (ID.0143) 194 0 R (ID.0144) 195 0 R (ID.0145) 196 0 R (ID.0146) 198 0 R (ID.0147) 199 0 R (ID.0148) 200 0 R (ID.0149) 201 0 R (ID.0150) 202 0 R (ID.0151) 203 0 R ] >> endobj -243 0 obj -<< /Limits [(ID.0152) (ID.0182)]/Names [(ID.0152) 193 0 R (ID.0153) 194 0 R (ID.0154) 195 0 R (ID.0155) 196 0 R (ID.0156) 197 0 R (ID.0157) 198 0 R (ID.0158) 200 0 R (ID.0159) 201 0 R (ID.0160) 203 0 R (ID.0161) 204 0 R (ID.0162) 205 0 R (ID.0163) 206 0 R (ID.0164) 207 0 R (ID.0165) 208 0 R (ID.0166) 209 0 R (ID.0167) 212 0 R (ID.0168) 213 0 R (ID.0169) 214 0 R (ID.0170) 215 0 R (ID.0171) 217 0 R (ID.0172) 218 0 R (ID.0173) 219 0 R (ID.0174) 220 0 R (ID.0175) 221 0 R (ID.0176) 222 0 R (ID.0177) 223 0 R (ID.0178) 224 0 R (ID.0179) 225 0 R (ID.0180) 226 0 R (ID.0181) 227 0 R (ID.0182) 228 0 R ] >> +236 0 obj +<< /Limits [(ID.0152) (ID.0166)]/Names [(ID.0152) 206 0 R (ID.0153) 207 0 R (ID.0154) 208 0 R (ID.0155) 210 0 R (ID.0156) 211 0 R (ID.0157) 212 0 R (ID.0158) 213 0 R (ID.0159) 214 0 R (ID.0160) 215 0 R (ID.0161) 216 0 R (ID.0162) 217 0 R (ID.0163) 218 0 R (ID.0164) 219 0 R (ID.0165) 220 0 R (ID.0166) 221 0 R ] >> endobj -244 0 obj -<< /Kids [240 0 R 241 0 R 242 0 R 243 0 R] >> +237 0 obj +<< /Kids [233 0 R 234 0 R 235 0 R 236 0 R] >> endobj 7 0 obj << /Artifact /NonStruct /DocumentFragment /Art /Aside /Note /H7 /H6 /H8 /H6 /H9 /H6 /H10 /H6 /Title /P /FENote /Note /Sub /Span /Em /Span /Strong /Span /title /P /part /P /section /H1 /subsection /H2 /subsubsection /H3 /paragraph /H4 /subparagraph /H5 /list /L /itemize /L /enumerate /L /description /L /quote /BlockQuote /quotation /BlockQuote /verbatim /P /item /LI /itemlabel /Lbl /itembody /LBody /footnote /Note /footnotemark /Lbl /footnotelabel /Lbl /text-unit /Part /text /P /theorem-like /Sect /codeline /Span /float /Note /figures /Sect /tables /Sect >> endobj +238 0 obj +<< /justify <> +/display <> +/inline <> +/TH-both <> +/TH-row <> +/TH-col <> + >> +endobj 9 0 obj << /Type /Namespace /NS (http://iso.org/pdf/ssn) >> endobj @@ -969,562 +1050,514 @@ endobj [ 9 0 R 11 0 R 13 0 R 15 0 R 17 0 R 19 0 R ] endobj 21 0 obj -<< /Type /StructElem /S /Document /NS 11 0 R /P 5 0 R /K 22 0 R /ID (ID.0002) >> -endobj -22 0 obj -<< /Type /StructElem /S /Document /NS 11 0 R /P 21 0 R /K [23 0 R 25 0 R 105 0 R 132 0 R 151 0 R 212 0 R] /ID (ID.0003) >> -endobj -23 0 obj -<< /Type /StructElem /S /P /NS 11 0 R /P 22 0 R /K <> /ID (ID.0004) >> -endobj -25 0 obj -<< /Type /StructElem /AF [24 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 79 0 R /ID (ID.0005) >> -endobj -26 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 89 0 R /K 27 0 R /ID (ID.0006) >> -endobj -27 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 26 0 R /K <> /ID (ID.0007) >> -endobj -28 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 89 0 R /K 29 0 R /ID (ID.0008) >> -endobj -29 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 28 0 R /K <> /ID (ID.0009) >> -endobj -30 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 89 0 R /K 31 0 R /ID (ID.0010) >> -endobj -31 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 30 0 R /K <> /ID (ID.0011) >> +<< /Type /StructElem /S /Document /NS 11 0 R /P 5 0 R /K [34 0 R 36 0 R 95 0 R 123 0 R 143 0 R 201 0 R] /ID (ID.0002) >> endobj 32 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 90 0 R /K 33 0 R /ID (ID.0012) >> +<< /Type /StructElem /S /Artifact /NS 15 0 R /P 5 0 R /ID (ID.0003) >> endobj 33 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 32 0 R /K <> /ID (ID.0013) >> +<< /Type /StructElem /S /Artifact /NS 15 0 R /P 5 0 R /ID (ID.0004) >> endobj 34 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 90 0 R /K 35 0 R /ID (ID.0014) >> +<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 35 0 R /ID (ID.0005) >> endobj 35 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 34 0 R /K <> /ID (ID.0015) >> +<< /Type /StructElem /C /justify /S /text /NS 15 0 R /P 34 0 R /K <> /ID (ID.0006) >> endobj 36 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 90 0 R /K 37 0 R /ID (ID.0016) >> +<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 37 0 R /ID (ID.0007) >> endobj 37 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 36 0 R /K <> /ID (ID.0017) >> -endobj -38 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 39 0 R /ID (ID.0018) >> -endobj -39 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 38 0 R /K <> /ID (ID.0019) >> +<< /Type /StructElem /C /display /AF [23 0 R 39 0 R] /T /S /Formula /NS 11 0 R /P 36 0 R /K [<> <> <> 71 0 R] /ID (ID.0008) >> endobj 40 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 41 0 R /ID (ID.0020) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 81 0 R /K 41 0 R /ID (ID.0009) >> endobj 41 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 40 0 R /K <> /ID (ID.0021) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 40 0 R /K <> /ID (ID.0010) >> endobj 42 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 43 0 R /ID (ID.0022) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 81 0 R /K 43 0 R /ID (ID.0011) >> endobj 43 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 42 0 R /K <> /ID (ID.0023) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 42 0 R /K <> /ID (ID.0012) >> endobj 44 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 99 0 R /K 45 0 R /ID (ID.0024) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 81 0 R /K 45 0 R /ID (ID.0013) >> endobj 45 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 44 0 R /K <> /ID (ID.0025) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 44 0 R /K <> /ID (ID.0014) >> endobj 46 0 obj -<< /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /K [ 47 0 R] /ID (ID.0026) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 82 0 R /K 47 0 R /ID (ID.0015) >> endobj 47 0 obj -<< /Type /StructElem /S /math /NS 13 0 R /P 46 0 R /K 48 0 R /ID (ID.0027) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 46 0 R /K <> /ID (ID.0016) >> endobj 48 0 obj -<< /Type /StructElem /A 49 0 R /S /mstyle /NS 13 0 R /P 47 0 R /K [50 0 R 51 0 R 53 0 R] /ID (ID.0028) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 82 0 R /K 49 0 R /ID (ID.0017) >> +endobj +49 0 obj +<< /Type /StructElem /S /mn /NS 13 0 R /P 48 0 R /K <> /ID (ID.0018) >> endobj 50 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 48 0 R /ID (ID.0029) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 82 0 R /K 51 0 R /ID (ID.0019) >> endobj 51 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 48 0 R /ID (ID.0030) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 50 0 R /K <> /ID (ID.0020) >> +endobj +52 0 obj +<< /Type /StructElem /S /mtd /NS 13 0 R /P 83 0 R /K 53 0 R /ID (ID.0021) >> endobj 53 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 48 0 R /ID (ID.0031) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 52 0 R /K <> /ID (ID.0022) >> endobj 54 0 obj -<< /Type /StructElem /S /mtext /NS 13 0 R /P 69 0 R /K [<> 55 0 R] /ID (ID.0032) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 83 0 R /K 55 0 R /ID (ID.0023) >> endobj 55 0 obj -<< /Type /StructElem /S /math /NS 13 0 R /P 54 0 R /K [56 0 R 57 0 R 58 0 R] /ID (ID.0033) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 54 0 R /K <> /ID (ID.0024) >> endobj 56 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 55 0 R /K <> /ID (ID.0034) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 83 0 R /K 57 0 R /ID (ID.0025) >> endobj 57 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 55 0 R /K <> /ID (ID.0035) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 56 0 R /K <> /ID (ID.0026) >> endobj 58 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 55 0 R /K <> /ID (ID.0036) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 59 0 R /ID (ID.0027) >> endobj 59 0 obj -<< /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /K [ 60 0 R] /ID (ID.0037) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 58 0 R /K <> /ID (ID.0028) >> endobj 60 0 obj -<< /Type /StructElem /S /math /NS 13 0 R /P 59 0 R /K [61 0 R 62 0 R 63 0 R] /ID (ID.0038) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 66 0 R /K [<> 61 0 R] /ID (ID.0029) >> endobj 61 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 60 0 R /ID (ID.0039) >> +<< /Type /StructElem /S /math /NS 13 0 R /P 60 0 R /K [62 0 R 63 0 R 65 0 R] /ID (ID.0030) >> endobj 62 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 60 0 R /ID (ID.0040) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 61 0 R /K <> /ID (ID.0031) >> endobj 63 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 60 0 R /ID (ID.0041) >> -endobj -64 0 obj -<< /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /K [ 65 0 R] /ID (ID.0042) >> +<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 61 0 R /K <> /ID (ID.0032) >> endobj 65 0 obj -<< /Type /StructElem /S /math /NS 13 0 R /P 64 0 R /K [66 0 R 67 0 R 68 0 R] /ID (ID.0043) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 61 0 R /K <> /ID (ID.0033) >> endobj 66 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 65 0 R /ID (ID.0044) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 60 0 R /ID (ID.0034) >> endobj 67 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 65 0 R /ID (ID.0045) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 92 0 R /K 68 0 R /ID (ID.0035) >> endobj 68 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 65 0 R /ID (ID.0046) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 67 0 R /K <> /ID (ID.0036) >> endobj 69 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 99 0 R /K [54 0 R 70 0 R] /ID (ID.0047) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 70 0 R /K <> /ID (ID.0037) >> endobj 70 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 69 0 R /ID (ID.0048) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 92 0 R /K 69 0 R /ID (ID.0038) >> endobj 71 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 100 0 R /K 72 0 R /ID (ID.0049) >> -endobj -72 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 71 0 R /K <> /ID (ID.0050) >> +<< /Type /StructElem /A 72 0 R /S /math /NS 13 0 R /P 37 0 R /K [73 0 R 86 0 R 87 0 R] /ID (ID.0039) >> endobj 73 0 obj -<< /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /ID (ID.0051) >> +<< /Type /StructElem /S /mrow /NS 13 0 R /P 71 0 R /K [74 0 R 76 0 R 78 0 R 84 0 R 85 0 R] /ID (ID.0040) >> endobj 74 0 obj -<< /Type /StructElem /S /mtext /NS 13 0 R /P 77 0 R /K <> /ID (ID.0052) >> -endobj -75 0 obj -<< /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /ID (ID.0053) >> +<< /Type /StructElem /A 75 0 R /ActualText /S /mo /NS 13 0 R /P 73 0 R /K <> /ID (ID.0041) >> endobj 76 0 obj -<< /Type /StructElem /S /Artifact /NS 13 0 R /P 5 0 R /ID (ID.0054) >> -endobj -77 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 100 0 R /K [74 0 R 78 0 R] /ID (ID.0055) >> +<< /Type /StructElem /A 77 0 R /S /mspace /NS 13 0 R /P 73 0 R /ID (ID.0042) >> endobj 78 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 77 0 R /ID (ID.0056) >> +<< /Type /StructElem /A 79 0 R /S /mpadded /NS 13 0 R /P 73 0 R /K 80 0 R /ID (ID.0043) >> endobj -79 0 obj -<< /Type /StructElem /A 80 0 R /S /math /NS 13 0 R /P 25 0 R /K [81 0 R 94 0 R 95 0 R] /ID (ID.0057) >> +80 0 obj +<< /Type /StructElem /S /mtable /NS 13 0 R /P 78 0 R /K [81 0 R 82 0 R 83 0 R] /ID (ID.0044) >> endobj 81 0 obj -<< /Type /StructElem /S /mrow /NS 13 0 R /P 79 0 R /K [82 0 R 84 0 R 86 0 R 92 0 R 93 0 R] /ID (ID.0058) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 80 0 R /K [40 0 R 42 0 R 44 0 R] /ID (ID.0045) >> endobj 82 0 obj -<< /Type /StructElem /A 83 0 R /ActualText /S /mo /NS 13 0 R /P 81 0 R /K <> /ID (ID.0059) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 80 0 R /K [46 0 R 48 0 R 50 0 R] /ID (ID.0046) >> +endobj +83 0 obj +<< /Type /StructElem /S /mtr /NS 13 0 R /P 80 0 R /K [52 0 R 54 0 R 56 0 R] /ID (ID.0047) >> endobj 84 0 obj -<< /Type /StructElem /A 85 0 R /S /mspace /NS 13 0 R /P 81 0 R /ID (ID.0060) >> +<< /Type /StructElem /A 77 0 R /S /mspace /NS 13 0 R /P 73 0 R /ID (ID.0048) >> +endobj +85 0 obj +<< /Type /StructElem /A 75 0 R /ActualText /S /mo /NS 13 0 R /P 73 0 R /K <> /ID (ID.0049) >> endobj 86 0 obj -<< /Type /StructElem /A 87 0 R /S /mpadded /NS 13 0 R /P 81 0 R /K 88 0 R /ID (ID.0061) >> +<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 71 0 R /K <> /ID (ID.0050) >> +endobj +87 0 obj +<< /Type /StructElem /S /mrow /NS 13 0 R /P 71 0 R /K [88 0 R 89 0 R 93 0 R] /ID (ID.0051) >> endobj 88 0 obj -<< /Type /StructElem /S /mtable /NS 13 0 R /P 86 0 R /K [89 0 R 90 0 R 91 0 R] /ID (ID.0062) >> +<< /Type /StructElem /A 75 0 R /ActualText /S /mo /NS 13 0 R /P 87 0 R /K <> /ID (ID.0052) >> endobj 89 0 obj -<< /Type /StructElem /S /mtr /NS 13 0 R /P 88 0 R /K [26 0 R 28 0 R 30 0 R] /ID (ID.0063) >> +<< /Type /StructElem /A 79 0 R /S /mpadded /NS 13 0 R /P 87 0 R /K 90 0 R /ID (ID.0053) >> endobj 90 0 obj -<< /Type /StructElem /S /mtr /NS 13 0 R /P 88 0 R /K [32 0 R 34 0 R 36 0 R] /ID (ID.0064) >> +<< /Type /StructElem /S /mtable /NS 13 0 R /P 89 0 R /K [91 0 R 92 0 R] /ID (ID.0054) >> endobj 91 0 obj -<< /Type /StructElem /S /mtr /NS 13 0 R /P 88 0 R /K [38 0 R 40 0 R 42 0 R] /ID (ID.0065) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 90 0 R /K [58 0 R 66 0 R] /ID (ID.0055) >> endobj 92 0 obj -<< /Type /StructElem /A 85 0 R /S /mspace /NS 13 0 R /P 81 0 R /ID (ID.0066) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 90 0 R /K [67 0 R 70 0 R] /ID (ID.0056) >> endobj 93 0 obj -<< /Type /StructElem /A 83 0 R /ActualText /S /mo /NS 13 0 R /P 81 0 R /K <> /ID (ID.0067) >> -endobj -94 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 79 0 R /K <> /ID (ID.0068) >> +<< /Type /StructElem /A 94 0 R /S /mspace /NS 13 0 R /P 87 0 R /ID (ID.0057) >> endobj 95 0 obj -<< /Type /StructElem /S /mrow /NS 13 0 R /P 79 0 R /K [96 0 R 97 0 R 101 0 R] /ID (ID.0069) >> +<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 96 0 R /ID (ID.0058) >> endobj 96 0 obj -<< /Type /StructElem /A 83 0 R /ActualText /S /mo /NS 13 0 R /P 95 0 R /K <> /ID (ID.0070) >> -endobj -97 0 obj -<< /Type /StructElem /A 87 0 R /S /mpadded /NS 13 0 R /P 95 0 R /K 98 0 R /ID (ID.0071) >> -endobj -98 0 obj -<< /Type /StructElem /S /mtable /NS 13 0 R /P 97 0 R /K [99 0 R 100 0 R] /ID (ID.0072) >> +<< /Type /StructElem /C /display /AF [25 0 R 98 0 R] /T /S /Formula /NS 11 0 R /P 95 0 R /K [<> <> 99 0 R] /ID (ID.0059) >> endobj 99 0 obj -<< /Type /StructElem /S /mtr /NS 13 0 R /P 98 0 R /K [44 0 R 69 0 R] /ID (ID.0073) >> +<< /Type /StructElem /A 72 0 R /S /math /NS 13 0 R /P 96 0 R /K [100 0 R 101 0 R 102 0 R 121 0 R] /ID (ID.0060) >> endobj 100 0 obj -<< /Type /StructElem /S /mtr /NS 13 0 R /P 98 0 R /K [71 0 R 77 0 R] /ID (ID.0074) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 99 0 R /K <> /ID (ID.0061) >> endobj 101 0 obj -<< /Type /StructElem /A 102 0 R /S /mspace /NS 13 0 R /P 95 0 R /ID (ID.0075) >> +<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 99 0 R /K <> /ID (ID.0062) >> endobj -105 0 obj -<< /Type /StructElem /AF [104 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 106 0 R /ID (ID.0076) >> +102 0 obj +<< /Type /StructElem /S /mfrac /NS 13 0 R /P 99 0 R /K [103 0 R 118 0 R] /ID (ID.0063) >> +endobj +103 0 obj +<< /Type /StructElem /S /mrow /NS 13 0 R /P 102 0 R /K [104 0 R 106 0 R 107 0 R 109 0 R] /ID (ID.0064) >> +endobj +104 0 obj +<< /Type /StructElem /A 105 0 R /S /mo /NS 13 0 R /P 103 0 R /K <> /ID (ID.0065) >> endobj 106 0 obj -<< /Type /StructElem /A 80 0 R /S /math /NS 13 0 R /P 105 0 R /K [107 0 R 108 0 R 109 0 R 128 0 R] /ID (ID.0077) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 103 0 R /K <> /ID (ID.0066) >> endobj 107 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 106 0 R /K <> /ID (ID.0078) >> -endobj -108 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 106 0 R /K <> /ID (ID.0079) >> +<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 103 0 R /K <> /ID (ID.0067) >> endobj 109 0 obj -<< /Type /StructElem /S /mfrac /NS 13 0 R /P 106 0 R /K [110 0 R 125 0 R] /ID (ID.0080) >> +<< /Type /StructElem /S /msqrt /NS 13 0 R /P 103 0 R /K 110 0 R /ID (ID.0068) >> endobj 110 0 obj -<< /Type /StructElem /S /mrow /NS 13 0 R /P 109 0 R /K [111 0 R 113 0 R 114 0 R 116 0 R] /ID (ID.0081) >> +<< /Type /StructElem /S /mrow /NS 13 0 R /P 109 0 R /K [111 0 R 114 0 R 115 0 R 116 0 R 117 0 R] /ID (ID.0069) >> endobj 111 0 obj -<< /Type /StructElem /A 112 0 R /S /mo /NS 13 0 R /P 110 0 R /K <> /ID (ID.0082) >> +<< /Type /StructElem /S /msup /NS 13 0 R /P 110 0 R /K [112 0 R 113 0 R] /ID (ID.0070) >> +endobj +112 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 111 0 R /K <> /ID (ID.0071) >> endobj 113 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 110 0 R /K <> /ID (ID.0083) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 111 0 R /K <> /ID (ID.0072) >> endobj 114 0 obj -<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 110 0 R /K <> /ID (ID.0084) >> +<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 110 0 R /K <> /ID (ID.0073) >> +endobj +115 0 obj +<< /Type /StructElem /S /mn /NS 13 0 R /P 110 0 R /K <> /ID (ID.0074) >> endobj 116 0 obj -<< /Type /StructElem /S /msqrt /NS 13 0 R /P 110 0 R /K 117 0 R /ID (ID.0085) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 110 0 R /K <> /ID (ID.0075) >> endobj 117 0 obj -<< /Type /StructElem /S /mrow /NS 13 0 R /P 116 0 R /K [118 0 R 121 0 R 122 0 R 123 0 R 124 0 R] /ID (ID.0086) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 110 0 R /K <> /ID (ID.0076) >> endobj 118 0 obj -<< /Type /StructElem /S /msup /NS 13 0 R /P 117 0 R /K [119 0 R 120 0 R] /ID (ID.0087) >> +<< /Type /StructElem /S /mrow /NS 13 0 R /P 102 0 R /K [119 0 R 120 0 R] /ID (ID.0077) >> endobj 119 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 118 0 R /K <> /ID (ID.0088) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 118 0 R /K <> /ID (ID.0078) >> endobj 120 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 118 0 R /K <> /ID (ID.0089) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 118 0 R /K <> /ID (ID.0079) >> endobj 121 0 obj -<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 117 0 R /K <> /ID (ID.0090) >> -endobj -122 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 117 0 R /K <> /ID (ID.0091) >> +<< /Type /StructElem /A 122 0 R /S /mo /NS 13 0 R /P 99 0 R /K <> /ID (ID.0080) >> endobj 123 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 117 0 R /K <> /ID (ID.0092) >> +<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 124 0 R /ID (ID.0081) >> endobj 124 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 117 0 R /K <> /ID (ID.0093) >> -endobj -125 0 obj -<< /Type /StructElem /S /mrow /NS 13 0 R /P 109 0 R /K [126 0 R 127 0 R] /ID (ID.0094) >> -endobj -126 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 125 0 R /K <> /ID (ID.0095) >> +<< /Type /StructElem /C /display /AF [27 0 R 126 0 R] /T /S /Formula /NS 11 0 R /P 123 0 R /K [<> 127 0 R] /ID (ID.0082) >> endobj 127 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 125 0 R /K <> /ID (ID.0096) >> +<< /Type /StructElem /A 72 0 R /S /math /NS 13 0 R /P 124 0 R /K [128 0 R 132 0 R 135 0 R 139 0 R] /ID (ID.0083) >> endobj 128 0 obj -<< /Type /StructElem /A 129 0 R /S /mo /NS 13 0 R /P 106 0 R /K <> /ID (ID.0097) >> +<< /Type /StructElem /S /munder /NS 13 0 R /P 127 0 R /K [129 0 R 131 0 R] /ID (ID.0084) >> +endobj +129 0 obj +<< /Type /StructElem /A 130 0 R /S /mo /NS 13 0 R /P 128 0 R /K <> /ID (ID.0085) >> +endobj +131 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 128 0 R /K <> /ID (ID.0086) >> endobj 132 0 obj -<< /Type /StructElem /AF [131 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 133 0 R /ID (ID.0098) >> +<< /Type /StructElem /S /munder /NS 13 0 R /P 127 0 R /K [133 0 R 134 0 R] /ID (ID.0087) >> endobj 133 0 obj -<< /Type /StructElem /A 80 0 R /S /math /NS 13 0 R /P 132 0 R /K [134 0 R 138 0 R 141 0 R 145 0 R] /ID (ID.0099) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 132 0 R /K <> /ID (ID.0088) >> endobj 134 0 obj -<< /Type /StructElem /S /munder /NS 13 0 R /P 133 0 R /K [135 0 R 137 0 R] /ID (ID.0100) >> +<< /Type /StructElem /S /mo /NS 13 0 R /P 132 0 R /ID (ID.0089) >> endobj 135 0 obj -<< /Type /StructElem /A 136 0 R /S /mo /NS 13 0 R /P 134 0 R /K <> /ID (ID.0101) >> +<< /Type /StructElem /S /mover /NS 13 0 R /P 127 0 R /K [136 0 R 137 0 R] /ID (ID.0090) >> +endobj +136 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 135 0 R /K <> /ID (ID.0091) >> endobj 137 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 134 0 R /K <> /ID (ID.0102) >> -endobj -138 0 obj -<< /Type /StructElem /S /munder /NS 13 0 R /P 133 0 R /K [139 0 R 140 0 R] /ID (ID.0103) >> +<< /Type /StructElem /A 138 0 R /ActualText /S /mo /NS 13 0 R /P 135 0 R /K <> /ID (ID.0092) >> endobj 139 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 138 0 R /K <> /ID (ID.0104) >> +<< /Type /StructElem /S /msup /NS 13 0 R /P 127 0 R /K [140 0 R 141 0 R] /ID (ID.0093) >> endobj 140 0 obj -<< /Type /StructElem /S /mo /NS 13 0 R /P 138 0 R /ID (ID.0105) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 139 0 R /K <> /ID (ID.0094) >> endobj 141 0 obj -<< /Type /StructElem /S /mover /NS 13 0 R /P 133 0 R /K [142 0 R 143 0 R] /ID (ID.0106) >> -endobj -142 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 141 0 R /K <> /ID (ID.0107) >> +<< /Type /StructElem /A 142 0 R /S /mi /NS 13 0 R /P 139 0 R /K <> /ID (ID.0095) >> endobj 143 0 obj -<< /Type /StructElem /A 144 0 R /ActualText /S /mo /NS 13 0 R /P 141 0 R /K <> /ID (ID.0108) >> +<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 144 0 R /ID (ID.0096) >> endobj -145 0 obj -<< /Type /StructElem /S /msup /NS 13 0 R /P 133 0 R /K [146 0 R 147 0 R] /ID (ID.0109) >> -endobj -146 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 145 0 R /K <> /ID (ID.0110) >> +144 0 obj +<< /Type /StructElem /C /display /AF [29 0 R 146 0 R] /T /S /Formula /NS 11 0 R /P 143 0 R /K [<> 169 0 R <> 185 0 R <> 194 0 R 195 0 R] /ID (ID.0097) >> endobj 147 0 obj -<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 145 0 R /K <> /ID (ID.0111) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 198 0 R /K [148 0 R 149 0 R 150 0 R] /ID (ID.0098) >> +endobj +148 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 147 0 R /K <> /ID (ID.0099) >> +endobj +149 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 147 0 R /K <> /ID (ID.0100) >> +endobj +150 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 147 0 R /K <> /ID (ID.0101) >> endobj 151 0 obj -<< /Type /StructElem /AF [150 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 197 0 R /ID (ID.0112) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 198 0 R /K [152 0 R 153 0 R 154 0 R 155 0 R 156 0 R] /ID (ID.0102) >> endobj 152 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K [153 0 R 154 0 R 155 0 R] /ID (ID.0113) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 151 0 R /ID (ID.0103) >> endobj 153 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 152 0 R /K <> /ID (ID.0114) >> +<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 151 0 R /K <> /ID (ID.0104) >> endobj 154 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 152 0 R /K <> /ID (ID.0115) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 151 0 R /K <> /ID (ID.0105) >> endobj 155 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 152 0 R /K <> /ID (ID.0116) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 151 0 R /K <> /ID (ID.0106) >> endobj 156 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K [157 0 R 158 0 R 159 0 R 160 0 R 161 0 R] /ID (ID.0117) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 151 0 R /K <> /ID (ID.0107) >> endobj 157 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /ID (ID.0118) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 198 0 R /K 158 0 R /ID (ID.0108) >> endobj 158 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 156 0 R /K <> /ID (ID.0119) >> +<< /Type /StructElem /S /msup /NS 13 0 R /P 157 0 R /K [159 0 R 160 0 R] /ID (ID.0109) >> endobj 159 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /K <> /ID (ID.0120) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 158 0 R /K <> /ID (ID.0110) >> endobj 160 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /K <> /ID (ID.0121) >> +<< /Type /StructElem /S /mrow /NS 13 0 R /P 158 0 R /K [161 0 R 162 0 R] /ID (ID.0111) >> endobj 161 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 156 0 R /K <> /ID (ID.0122) >> +<< /Type /StructElem /A 142 0 R /S /mi /NS 13 0 R /P 160 0 R /K <> /ID (ID.0112) >> endobj 162 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 163 0 R /ID (ID.0123) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 160 0 R /K <> /ID (ID.0113) >> endobj 163 0 obj -<< /Type /StructElem /S /msup /NS 13 0 R /P 162 0 R /K [164 0 R 165 0 R] /ID (ID.0124) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 198 0 R /K [164 0 R 165 0 R 167 0 R 168 0 R] /ID (ID.0114) >> endobj 164 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 163 0 R /K <> /ID (ID.0125) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 163 0 R /ID (ID.0115) >> endobj 165 0 obj -<< /Type /StructElem /S /mrow /NS 13 0 R /P 163 0 R /K [166 0 R 167 0 R] /ID (ID.0126) >> -endobj -166 0 obj -<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 165 0 R /K <> /ID (ID.0127) >> +<< /Type /StructElem /A 166 0 R /S /mo /NS 13 0 R /P 163 0 R /K <> /ID (ID.0116) >> endobj 167 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 165 0 R /K <> /ID (ID.0128) >> +<< /Type /StructElem /A 166 0 R /S /mo /NS 13 0 R /P 163 0 R /K <> /ID (ID.0117) >> endobj 168 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K [169 0 R 170 0 R 172 0 R 173 0 R] /ID (ID.0129) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 163 0 R /K <> /ID (ID.0118) >> endobj 169 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 168 0 R /ID (ID.0130) >> +<< /Type /StructElem /S /Lbl /NS 11 0 R /P 144 0 R /K <> /ID (ID.0119) >> endobj 170 0 obj -<< /Type /StructElem /A 171 0 R /S /mo /NS 13 0 R /P 168 0 R /K <> /ID (ID.0131) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 199 0 R /K [171 0 R 173 0 R 174 0 R 175 0 R] /ID (ID.0120) >> endobj -172 0 obj -<< /Type /StructElem /A 171 0 R /S /mo /NS 13 0 R /P 168 0 R /K <> /ID (ID.0132) >> +171 0 obj +<< /Type /StructElem /A 172 0 R /ActualText /S /mo /NS 13 0 R /P 170 0 R /K <> /ID (ID.0121) >> endobj 173 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 168 0 R /K <> /ID (ID.0133) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 170 0 R /K <> /ID (ID.0122) >> endobj 174 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 204 0 R /K [175 0 R 177 0 R 178 0 R 179 0 R] /ID (ID.0134) >> +<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 170 0 R /K <> /ID (ID.0123) >> endobj 175 0 obj -<< /Type /StructElem /A 176 0 R /ActualText /S /mo /NS 13 0 R /P 174 0 R /K <> /ID (ID.0135) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 170 0 R /K <> /ID (ID.0124) >> +endobj +176 0 obj +<< /Type /StructElem /S /mtd /NS 13 0 R /P 199 0 R /K [177 0 R 178 0 R 179 0 R 180 0 R] /ID (ID.0125) >> endobj 177 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 174 0 R /K <> /ID (ID.0136) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 176 0 R /ID (ID.0126) >> endobj 178 0 obj -<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 174 0 R /K <> /ID (ID.0137) >> +<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 176 0 R /K <> /ID (ID.0127) >> endobj 179 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 174 0 R /K <> /ID (ID.0138) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 176 0 R /K <> /ID (ID.0128) >> endobj 180 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 204 0 R /K [181 0 R 182 0 R 183 0 R 184 0 R] /ID (ID.0139) >> +<< /Type /StructElem /A 172 0 R /ActualText /S /mo /NS 13 0 R /P 176 0 R /K <> /ID (ID.0129) >> endobj 181 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 180 0 R /ID (ID.0140) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 199 0 R /K 182 0 R /ID (ID.0130) >> endobj 182 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 180 0 R /K <> /ID (ID.0141) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 181 0 R /ID (ID.0131) >> endobj 183 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 180 0 R /K <> /ID (ID.0142) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 199 0 R /K 184 0 R /ID (ID.0132) >> endobj 184 0 obj -<< /Type /StructElem /A 176 0 R /ActualText /S /mo /NS 13 0 R /P 180 0 R /K <> /ID (ID.0143) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 183 0 R /ID (ID.0133) >> endobj 185 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 204 0 R /K 186 0 R /ID (ID.0144) >> +<< /Type /StructElem /S /Lbl /NS 11 0 R /P 144 0 R /K <> /ID (ID.0134) >> endobj 186 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 185 0 R /ID (ID.0145) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 187 0 R /ID (ID.0135) >> endobj 187 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 204 0 R /K 188 0 R /ID (ID.0146) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 186 0 R /K <> /ID (ID.0136) >> endobj 188 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 187 0 R /ID (ID.0147) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 189 0 R /ID (ID.0137) >> endobj 189 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 207 0 R /K 190 0 R /ID (ID.0148) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 188 0 R /ID (ID.0138) >> endobj 190 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 189 0 R /K <> /ID (ID.0149) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 191 0 R /ID (ID.0139) >> endobj 191 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 207 0 R /K 192 0 R /ID (ID.0150) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 190 0 R /ID (ID.0140) >> endobj 192 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 191 0 R /ID (ID.0151) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 193 0 R /ID (ID.0141) >> endobj 193 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 207 0 R /K 194 0 R /ID (ID.0152) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 192 0 R /ID (ID.0142) >> endobj 194 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 193 0 R /ID (ID.0153) >> +<< /Type /StructElem /S /Lbl /NS 11 0 R /P 144 0 R /K <> /ID (ID.0143) >> endobj 195 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 207 0 R /K 196 0 R /ID (ID.0154) >> +<< /Type /StructElem /A 72 0 R /S /math /NS 13 0 R /P 144 0 R /K 196 0 R /ID (ID.0144) >> endobj 196 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 195 0 R /ID (ID.0155) >> -endobj -197 0 obj -<< /Type /StructElem /A 80 0 R /S /math /NS 13 0 R /P 151 0 R /K 198 0 R /ID (ID.0156) >> +<< /Type /StructElem /A 197 0 R /S /mtable /NS 13 0 R /P 195 0 R /K [198 0 R 199 0 R 200 0 R] /ID (ID.0145) >> endobj 198 0 obj -<< /Type /StructElem /A 199 0 R /S /mtable /NS 13 0 R /P 197 0 R /K [200 0 R 204 0 R 207 0 R] /ID (ID.0157) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 196 0 R /K [147 0 R 151 0 R 157 0 R 163 0 R] /ID (ID.0146) >> +endobj +199 0 obj +<< /Type /StructElem /S /mtr /NS 13 0 R /P 196 0 R /K [170 0 R 176 0 R 181 0 R 183 0 R] /ID (ID.0147) >> endobj 200 0 obj -<< /Type /StructElem /S /mtr /NS 13 0 R /P 198 0 R /K [201 0 R 152 0 R 156 0 R 162 0 R 168 0 R] /ID (ID.0158) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 196 0 R /K [186 0 R 188 0 R 190 0 R 192 0 R] /ID (ID.0148) >> endobj 201 0 obj -<< /Type /StructElem /A 202 0 R /S /mtd /NS 13 0 R /P 200 0 R /K 203 0 R /ID (ID.0159) >> +<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 202 0 R /ID (ID.0149) >> +endobj +202 0 obj +<< /Type /StructElem /C /justify /S /text /NS 15 0 R /P 201 0 R /K [<> 203 0 R <> ] /ID (ID.0150) >> endobj 203 0 obj -<< /Type /StructElem /S /mtext /NS 13 0 R /P 201 0 R /ID (ID.0160) >> -endobj -204 0 obj -<< /Type /StructElem /S /mtr /NS 13 0 R /P 198 0 R /K [205 0 R 174 0 R 180 0 R 185 0 R 187 0 R] /ID (ID.0161) >> -endobj -205 0 obj -<< /Type /StructElem /A 202 0 R /S /mtd /NS 13 0 R /P 204 0 R /K 206 0 R /ID (ID.0162) >> +<< /Type /StructElem /C /inline /AF [31 0 R 205 0 R] /T /S /Formula /NS 11 0 R /P 202 0 R /K [<> 206 0 R] /ID (ID.0151) >> endobj 206 0 obj -<< /Type /StructElem /S /mtext /NS 13 0 R /P 205 0 R /ID (ID.0163) >> +<< /Type /StructElem /S /math /NS 13 0 R /P 203 0 R /K [207 0 R 208 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R] /ID (ID.0152) >> endobj 207 0 obj -<< /Type /StructElem /S /mtr /NS 13 0 R /P 198 0 R /K [208 0 R 189 0 R 191 0 R 193 0 R 195 0 R] /ID (ID.0164) >> +<< /Type /StructElem /A 142 0 R /S /mi /NS 13 0 R /P 206 0 R /K <> /ID (ID.0153) >> endobj 208 0 obj -<< /Type /StructElem /A 202 0 R /S /mtd /NS 13 0 R /P 207 0 R /K 209 0 R /ID (ID.0165) >> +<< /Type /StructElem /A 209 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0154) >> endobj -209 0 obj -<< /Type /StructElem /S /mtext /NS 13 0 R /P 208 0 R /ID (ID.0166) >> +210 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 206 0 R /K <> /ID (ID.0155) >> +endobj +211 0 obj +<< /Type /StructElem /A 209 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0156) >> endobj 212 0 obj -<< /Type /StructElem /AF [211 0 R] /S /Formula /NS 11 0 R /P 22 0 R /K 213 0 R /ID (ID.0167) >> +<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0157) >> endobj 213 0 obj -<< /Type /StructElem /S /math /NS 13 0 R /P 212 0 R /K [214 0 R 215 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R] /ID (ID.0168) >> +<< /Type /StructElem /A 142 0 R /S /mi /NS 13 0 R /P 206 0 R /K <> /ID (ID.0158) >> endobj 214 0 obj -<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 213 0 R /K <> /ID (ID.0169) >> +<< /Type /StructElem /A 209 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0159) >> endobj 215 0 obj -<< /Type /StructElem /A 216 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0170) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 206 0 R /K <> /ID (ID.0160) >> +endobj +216 0 obj +<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0161) >> endobj 217 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 213 0 R /K <> /ID (ID.0171) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 206 0 R /K <> /ID (ID.0162) >> endobj 218 0 obj -<< /Type /StructElem /A 216 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0172) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 206 0 R /K <> /ID (ID.0163) >> endobj 219 0 obj -<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0173) >> +<< /Type /StructElem /A 209 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0164) >> endobj 220 0 obj -<< /Type /StructElem /A 148 0 R /S /mi /NS 13 0 R /P 213 0 R /K <> /ID (ID.0174) >> +<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0165) >> endobj 221 0 obj -<< /Type /StructElem /A 216 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0175) >> -endobj -222 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 213 0 R /K <> /ID (ID.0176) >> -endobj -223 0 obj -<< /Type /StructElem /A 115 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0177) >> -endobj -224 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 213 0 R /K <> /ID (ID.0178) >> -endobj -225 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 213 0 R /K <> /ID (ID.0179) >> -endobj -226 0 obj -<< /Type /StructElem /A 216 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0180) >> -endobj -227 0 obj -<< /Type /StructElem /A 52 0 R /S /mo /NS 13 0 R /P 213 0 R /K <> /ID (ID.0181) >> -endobj -228 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 213 0 R /K <> /ID (ID.0182) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 206 0 R /K <> /ID (ID.0166) >> endobj 5 0 obj -<< /Type /StructTreeRoot /Namespaces 8 0 R /IDTree 244 0 R /ParentTree 6 0 R /RoleMap 7 0 R /K 21 0 R >> +<< /Type /StructTreeRoot /Namespaces 8 0 R /IDTree 237 0 R /ClassMap 238 0 R /ParentTree 6 0 R /RoleMap 7 0 R /K 21 0 R >> endobj -245 0 obj +239 0 obj [ 66 [ 323 ] ] endobj -247 0 obj +241 0 obj << /Subtype /CIDFontType0C /Length 592 >> [BINARY STREAM] endobj -246 0 obj -<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 247 0 R >> +240 0 obj +<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 241 0 R >> endobj -248 0 obj +242 0 obj << /Length 687 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1560,23 +1593,23 @@ end %%EOF endstream endobj -237 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 249 0 R ] /ToUnicode 248 0 R >> +229 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 243 0 R ] /ToUnicode 242 0 R >> endobj -249 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 246 0 R /W 245 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +243 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 240 0 R /W 239 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -250 0 obj +244 0 obj [ 1013 [ 569 ] 1404 [ 620 ] 2981 [ 407 ] 4558 [ 668 ] ] endobj -252 0 obj +246 0 obj << /Subtype /CIDFontType0C /Length 1102 >> [BINARY STREAM] endobj -251 0 obj -<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 252 0 R >> +245 0 obj +<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 246 0 R >> endobj -253 0 obj +247 0 obj << /Length 772 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1615,23 +1648,23 @@ end %%EOF endstream endobj -236 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 254 0 R ] /ToUnicode 253 0 R >> +228 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 248 0 R ] /ToUnicode 247 0 R >> endobj -254 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 251 0 R /W 250 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +248 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 245 0 R /W 244 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -255 0 obj +249 0 obj [ 9 [ 389 389 ] 12 [ 778 ] 15 [ 278 ] 17 [ 500 500 500 500 500 500 ] 30 [ 778 ] 1296 [ 529 429 433 520 466 490 ] 1319 [ 572 ] 1790 [ 0 ] 2455 [ 663 663 ] 2503 [ 875 875 875 875 875 875 ] 2515 [ 902 ] 2615 [ 778 ] 2619 [ 778 ] 3074 [ 1444 ] 3077 [ 833 ] 4474 [ 570 ] ] endobj -257 0 obj +251 0 obj << /Subtype /CIDFontType0C /Length 4088 >> [BINARY STREAM] endobj -256 0 obj -<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 257 0 R >> +250 0 obj +<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 251 0 R >> endobj -258 0 obj +252 0 obj << /Length 1203 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1699,23 +1732,23 @@ end %%EOF endstream endobj -235 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 259 0 R ] /ToUnicode 258 0 R >> +227 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 253 0 R ] /ToUnicode 252 0 R >> endobj -259 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 256 0 R /W 255 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +253 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 250 0 R /W 249 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -260 0 obj +254 0 obj [ 49 [ 681 444 ] 55 [ 306 ] 59 [ 500 ] 63 [ 556 ] 66 [ 278 ] 72 [ 278 ] 77 [ 556 ] 81 [ 500 500 ] 85 [ 389 389 ] 88 [ 278 ] 98 [ 394 ] 103 [ 333 ] 105 [ 389 500 500 ] ] endobj -262 0 obj +256 0 obj << /Subtype /CIDFontType0C /Length 2411 >> [BINARY STREAM] endobj -261 0 obj -<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 262 0 R >> +255 0 obj +<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 256 0 R >> endobj -263 0 obj +257 0 obj << /Length 931 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1768,292 +1801,290 @@ end %%EOF endstream endobj -234 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 264 0 R ] /ToUnicode 263 0 R >> +226 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 258 0 R ] /ToUnicode 257 0 R >> endobj -264 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 261 0 R /W 260 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +258 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 255 0 R /W 254 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -238 0 obj -<< /Type /Pages /Count 1 /Kids [ 232 0 R ] >> +230 0 obj +<< /Type /Pages /Count 1 /Kids [ 224 0 R ] >> endobj -265 0 obj -<< /Type /Catalog /Pages 238 0 R /MarkInfo 239 0 R/Lang (en)/Metadata 230 0 R/StructTreeRoot 5 0 R >> +259 0 obj +<< /EmbeddedFiles 232 0 R >> endobj -266 0 obj +260 0 obj +<< /Type /Catalog /Pages 230 0 R /Names 259 0 R /MarkInfo 231 0 R/Lang (en)/Metadata 222 0 R/StructTreeRoot 5 0 R >> +endobj +261 0 obj << /Producer (LuaTeX)/Creator (TeX)/CreationDate (D:20160520090000Z)/ModDate (D:20160520090000Z) /Trapped /False >> endobj xref -0 267 +0 262 0000000002 65535 f -0000026064 00000 n +0000027968 00000 n 0000000003 00000 f 0000000004 00000 f 0000000010 00000 f -0000053379 00000 n -0000026148 00000 n -0000030276 00000 n -0000032230 00000 n -0000030855 00000 n -0000000012 00000 f -0000030923 00000 n -0000000014 00000 f -0000030993 00000 n -0000000020 00000 f -0000031756 00000 n -0000031074 00000 n -0000032034 00000 n -0000031863 00000 n +0000054820 00000 n +0000028173 00000 n 0000032141 00000 n +0000034336 00000 n +0000032961 00000 n +0000000012 00000 f +0000033029 00000 n +0000000014 00000 f +0000033099 00000 n +0000000020 00000 f +0000033862 00000 n +0000033180 00000 n +0000034140 00000 n +0000033969 00000 n +0000034247 00000 n 0000000000 00000 f -0000032291 00000 n -0000032390 00000 n -0000032531 00000 n -0000001687 00000 n -0000032653 00000 n -0000032765 00000 n -0000032860 00000 n -0000032983 00000 n -0000033078 00000 n -0000033201 00000 n -0000033296 00000 n -0000033419 00000 n -0000033514 00000 n -0000033637 00000 n -0000033732 00000 n -0000033855 00000 n -0000033950 00000 n -0000034073 00000 n -0000034168 00000 n -0000034291 00000 n -0000034386 00000 n -0000034509 00000 n -0000034604 00000 n -0000034728 00000 n -0000034823 00000 n -0000034947 00000 n -0000035049 00000 n -0000035145 00000 n +0000034397 00000 n 0000000020 00000 n -0000035270 00000 n -0000035354 00000 n -0000000093 00000 n -0000035449 00000 n -0000035533 00000 n -0000035669 00000 n -0000035781 00000 n -0000035905 00000 n -0000036040 00000 n -0000036164 00000 n -0000036266 00000 n -0000036378 00000 n -0000036462 00000 n -0000036557 00000 n -0000036641 00000 n -0000036743 00000 n -0000036855 00000 n -0000036939 00000 n -0000037034 00000 n -0000037118 00000 n -0000037222 00000 n -0000037306 00000 n -0000037402 00000 n -0000037526 00000 n -0000037615 00000 n -0000037742 00000 n -0000037831 00000 n -0000037920 00000 n -0000038025 00000 n -0000038109 00000 n -0000000164 00000 n -0000038232 00000 n -0000038358 00000 n -0000000218 00000 n -0000038515 00000 n -0000000305 00000 n -0000038614 00000 n -0000000360 00000 n -0000038724 00000 n -0000038838 00000 n -0000038949 00000 n -0000039060 00000 n -0000039171 00000 n -0000039270 00000 n -0000039428 00000 n -0000039563 00000 n -0000039676 00000 n -0000039834 00000 n -0000039944 00000 n -0000040052 00000 n -0000040156 00000 n -0000040261 00000 n -0000000432 00000 n -0000000487 00000 n -0000002601 00000 n -0000040362 00000 n -0000040477 00000 n -0000040613 00000 n -0000040739 00000 n -0000040876 00000 n -0000040986 00000 n -0000041111 00000 n -0000001839 00000 n -0000041249 00000 n -0000041375 00000 n -0000001905 00000 n -0000041513 00000 n -0000041613 00000 n -0000041746 00000 n -0000041855 00000 n -0000041981 00000 n -0000042107 00000 n -0000042245 00000 n -0000042371 00000 n -0000042497 00000 n -0000042623 00000 n -0000042732 00000 n -0000042858 00000 n -0000042984 00000 n -0000001977 00000 n -0000002037 00000 n -0000003366 00000 n -0000043122 00000 n -0000043237 00000 n -0000043373 00000 n -0000043484 00000 n -0000002754 00000 n -0000043622 00000 n -0000043748 00000 n -0000043859 00000 n -0000043985 00000 n -0000044071 00000 n -0000044181 00000 n -0000044307 00000 n -0000002840 00000 n -0000044468 00000 n -0000044577 00000 n -0000044703 00000 n -0000002895 00000 n -0000002955 00000 n -0000005140 00000 n -0000044841 00000 n -0000044956 00000 n -0000045072 00000 n -0000045198 00000 n -0000045324 00000 n -0000045450 00000 n -0000045582 00000 n -0000045668 00000 n -0000045805 00000 n -0000045931 00000 n -0000046057 00000 n -0000046183 00000 n -0000046281 00000 n -0000046390 00000 n -0000046516 00000 n -0000046625 00000 n -0000046763 00000 n +0000000299 00000 n +0000000486 00000 n +0000001131 00000 n +0000001318 00000 n +0000001800 00000 n +0000001987 00000 n +0000003198 00000 n +0000003385 00000 n +0000004064 00000 n +0000034536 00000 n +0000034625 00000 n +0000034714 00000 n +0000034815 00000 n +0000034952 00000 n +0000035053 00000 n +0000004251 00000 n +0000004566 00000 n +0000035339 00000 n +0000035434 00000 n +0000035557 00000 n +0000035652 00000 n +0000035775 00000 n +0000035870 00000 n +0000035993 00000 n +0000036088 00000 n +0000036211 00000 n +0000036306 00000 n +0000036429 00000 n +0000036524 00000 n +0000036647 00000 n +0000036742 00000 n +0000036866 00000 n +0000036961 00000 n +0000037085 00000 n +0000037180 00000 n +0000037304 00000 n +0000037399 00000 n +0000037523 00000 n +0000037659 00000 n +0000037771 00000 n +0000037895 00000 n +0000004766 00000 n +0000038030 00000 n +0000038154 00000 n +0000038249 00000 n +0000038344 00000 n +0000038468 00000 n +0000038595 00000 n +0000038690 00000 n +0000004837 00000 n +0000038813 00000 n +0000038939 00000 n +0000004891 00000 n +0000039096 00000 n +0000004978 00000 n +0000039195 00000 n +0000005033 00000 n +0000039305 00000 n +0000039419 00000 n +0000039530 00000 n +0000039641 00000 n +0000039752 00000 n +0000039851 00000 n +0000040009 00000 n +0000040144 00000 n +0000040256 00000 n +0000040414 00000 n +0000040524 00000 n +0000040631 00000 n +0000040735 00000 n +0000040839 00000 n +0000005105 00000 n +0000040938 00000 n +0000041039 00000 n +0000005159 00000 n +0000005375 00000 n +0000041291 00000 n +0000041425 00000 n +0000041550 00000 n +0000041686 00000 n +0000041795 00000 n +0000041920 00000 n +0000005575 00000 n +0000042058 00000 n +0000042184 00000 n +0000005641 00000 n +0000042322 00000 n +0000042422 00000 n +0000042555 00000 n +0000042664 00000 n +0000042790 00000 n +0000042916 00000 n +0000043054 00000 n +0000043180 00000 n +0000043306 00000 n +0000043432 00000 n +0000043541 00000 n +0000043667 00000 n +0000043793 00000 n +0000005713 00000 n +0000043930 00000 n +0000044033 00000 n +0000005773 00000 n +0000005978 00000 n +0000044253 00000 n +0000044389 00000 n +0000044500 00000 n +0000006181 00000 n +0000044638 00000 n +0000044764 00000 n +0000044875 00000 n +0000045001 00000 n +0000045087 00000 n +0000045197 00000 n +0000045323 00000 n +0000006267 00000 n +0000045484 00000 n +0000045593 00000 n +0000045719 00000 n +0000006322 00000 n +0000045857 00000 n +0000045960 00000 n +0000006382 00000 n +0000006611 00000 n +0000046263 00000 n +0000046379 00000 n +0000046505 00000 n +0000046631 00000 n +0000046757 00000 n 0000046889 00000 n -0000047013 00000 n -0000047099 00000 n -0000003519 00000 n -0000047237 00000 n -0000047375 00000 n -0000047501 00000 n -0000047625 00000 n -0000003585 00000 n -0000047786 00000 n -0000047912 00000 n -0000048050 00000 n -0000048176 00000 n -0000048300 00000 n -0000048386 00000 n -0000048523 00000 n -0000048649 00000 n -0000048810 00000 n -0000048908 00000 n -0000048994 00000 n -0000049092 00000 n -0000049178 00000 n -0000049276 00000 n -0000049402 00000 n -0000049500 00000 n -0000049586 00000 n -0000049684 00000 n -0000049770 00000 n -0000049868 00000 n -0000049954 00000 n -0000050064 00000 n -0000003709 00000 n -0000050195 00000 n -0000050327 00000 n -0000003827 00000 n -0000050437 00000 n +0000046975 00000 n +0000047112 00000 n +0000047238 00000 n +0000047364 00000 n +0000047490 00000 n +0000047588 00000 n +0000047697 00000 n +0000047823 00000 n +0000047932 00000 n +0000048070 00000 n +0000048196 00000 n +0000048320 00000 n +0000048406 00000 n +0000006814 00000 n +0000048544 00000 n +0000048682 00000 n +0000048808 00000 n +0000048935 00000 n +0000049059 00000 n +0000006880 00000 n +0000049220 00000 n +0000049346 00000 n +0000049484 00000 n +0000049610 00000 n +0000049734 00000 n +0000049820 00000 n +0000049957 00000 n +0000050083 00000 n +0000050244 00000 n +0000050342 00000 n +0000050428 00000 n 0000050526 00000 n -0000050658 00000 n -0000050768 00000 n -0000050857 00000 n -0000050989 00000 n -0000051099 00000 n -0000003890 00000 n -0000005975 00000 n -0000051188 00000 n -0000051303 00000 n -0000051508 00000 n -0000051646 00000 n -0000005293 00000 n -0000051784 00000 n -0000051910 00000 n -0000052048 00000 n -0000052186 00000 n -0000052324 00000 n -0000052462 00000 n -0000052588 00000 n -0000052726 00000 n -0000052852 00000 n -0000052978 00000 n -0000053116 00000 n -0000053253 00000 n -0000005369 00000 n -0000006128 00000 n -0000025960 00000 n -0000025821 00000 n -0000017912 00000 n -0000068455 00000 n -0000064186 00000 n -0000057862 00000 n -0000055180 00000 n -0000068815 00000 n -0000026111 00000 n -0000026779 00000 n -0000027691 00000 n -0000028631 00000 n -0000029593 00000 n -0000030213 00000 n -0000053500 00000 n -0000054209 00000 n -0000053532 00000 n -0000054432 00000 n -0000055336 00000 n -0000055538 00000 n -0000056798 00000 n -0000055611 00000 n -0000057029 00000 n -0000058025 00000 n -0000058234 00000 n -0000062692 00000 n -0000058519 00000 n -0000062922 00000 n -0000064349 00000 n -0000064558 00000 n -0000067240 00000 n -0000064744 00000 n -0000067463 00000 n -0000068612 00000 n -0000068879 00000 n -0000068998 00000 n +0000050612 00000 n +0000050739 00000 n +0000050837 00000 n +0000050963 00000 n +0000051061 00000 n +0000051147 00000 n +0000051245 00000 n +0000051331 00000 n +0000051429 00000 n +0000051515 00000 n +0000051642 00000 n +0000051752 00000 n +0000007004 00000 n +0000051883 00000 n +0000052007 00000 n +0000052131 00000 n +0000052255 00000 n +0000052358 00000 n +0000052545 00000 n +0000007122 00000 n +0000007293 00000 n +0000052744 00000 n +0000052949 00000 n +0000053087 00000 n +0000007496 00000 n +0000053225 00000 n +0000053351 00000 n +0000053489 00000 n +0000053627 00000 n +0000053765 00000 n +0000053903 00000 n +0000054029 00000 n +0000054167 00000 n +0000054293 00000 n +0000054419 00000 n +0000054557 00000 n +0000054694 00000 n +0000007572 00000 n +0000027864 00000 n +0000027725 00000 n +0000019356 00000 n +0000069914 00000 n +0000065645 00000 n +0000059321 00000 n +0000056639 00000 n +0000070274 00000 n +0000028015 00000 n +0000028052 00000 n +0000028919 00000 n +0000029831 00000 n +0000030784 00000 n +0000031746 00000 n +0000032078 00000 n +0000032720 00000 n +0000054959 00000 n +0000055668 00000 n +0000054991 00000 n +0000055891 00000 n +0000056795 00000 n +0000056997 00000 n +0000058257 00000 n +0000057070 00000 n +0000058488 00000 n +0000059484 00000 n +0000059693 00000 n +0000064151 00000 n +0000059978 00000 n +0000064381 00000 n +0000065808 00000 n +0000066017 00000 n +0000068699 00000 n +0000066203 00000 n +0000068922 00000 n +0000070071 00000 n +0000070338 00000 n +0000070384 00000 n +0000070518 00000 n trailer -<< /Size 267 /Root 265 0 R /Info 266 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> +<< /Size 262 /Root 260 0 R /Info 261 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> startxref -69131 +70651 %%EOF From 80ec1995de6f492fea3c349eec2582f9e35ecfca Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Wed, 4 Dec 2024 18:32:11 +0100 Subject: [PATCH 140/206] update testfiles --- testfiles-lua/cases.mlr | 5 +---- testfiles-lua/test_xml.mlr | 28 ---------------------------- testfiles-lua/test_xml.mlt | 27 +++++++++++++-------------- 3 files changed, 14 insertions(+), 46 deletions(-) diff --git a/testfiles-lua/cases.mlr b/testfiles-lua/cases.mlr index ab7b075..35edb39 100644 --- a/testfiles-lua/cases.mlr +++ b/testfiles-lua/cases.mlr @@ -106,9 +106,6 @@ . - - ๐‘ - โˆ‘ @@ -120,7 +117,7 @@ ๐‘ - _ + . ๐‘ diff --git a/testfiles-lua/test_xml.mlr b/testfiles-lua/test_xml.mlr index 94a71cc..bc4dd76 100644 --- a/testfiles-lua/test_xml.mlr +++ b/testfiles-lua/test_xml.mlr @@ -1,20 +1,3 @@ - - - ๐‘Ž - = - ๐‘ - - - - ๐‘Ž - = - ๐‘ - - - ๐‘Ž - = - ๐‘ - ๐‘Ž = @@ -80,7 +63,6 @@ = ๐‘ - @@ -89,7 +71,6 @@ else - @@ -146,9 +127,6 @@ - - (1) - ๐‘Ž ๐‘ @@ -178,9 +156,6 @@ - - (2) - ( 1 @@ -201,9 +176,6 @@ - - (3) - 5 diff --git a/testfiles-lua/test_xml.mlt b/testfiles-lua/test_xml.mlt index ff1a82b..004279b 100644 --- a/testfiles-lua/test_xml.mlt +++ b/testfiles-lua/test_xml.mlt @@ -1,17 +1,21 @@ \DocumentMetadata{ uncompress, pdfversion = 2.0, - testphase = phase-I, + testphase = {phase-III,table,math}, } \input{regression-test} \documentclass{article} -\usepackage[l3build]{luamml-demo} - \usepackage{unicode-math} \begin{document} -\tagstructbegin{tag=Document} -\LuaMMLTagAF{} { +\ExplSyntaxOn +\luamml_set_filename:n { + \jobname .mml + } +\luamml_process: +\luamml_begin_single_file: +\ExplSyntaxOff + \[ \begin{pmatrix} 1 & 0 & 0 \\ @@ -24,26 +28,21 @@ 2 & \text{else} \end{cases} \] -} -\LuaMMLTagAF{} { + \[ x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}. \] -} -\LuaMMLTagAF{} { + \[ \sum_a\underline c\dot bc' \] -} -\LuaMMLTagAF{} { \begin{align} abc&=def & e^{\mathrm{i}\pi}&=-1\\ \Big(1+2&=3\Big)\\ 5 \end{align} -} -Es gilt \LuaMMLTagAF{}{$\sin(x)-\sin(x+2\pi)=0$}. -\tagstructend +Es gilt $\sin(x)-\sin(x+2\pi)=0$. + \end{document} From 13c4c7e17310ef7fbcab35aba5f19603793fac5e Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Wed, 4 Dec 2024 19:41:39 +0100 Subject: [PATCH 141/206] correct handling of roots with degree --- luamml-convert.lua | 3 +- testfiles-lua/test_sqrt-xml.mlr | 33 ++ testfiles-lua/test_sqrt-xml.mlt | 28 + testfiles-lua/test_sqrt.pvt | 22 + testfiles-lua/test_sqrt.tpf | 990 ++++++++++++++++++++++++++++++++ 5 files changed, 1075 insertions(+), 1 deletion(-) create mode 100644 testfiles-lua/test_sqrt-xml.mlr create mode 100644 testfiles-lua/test_sqrt-xml.mlt create mode 100644 testfiles-lua/test_sqrt.pvt create mode 100644 testfiles-lua/test_sqrt.tpf diff --git a/luamml-convert.lua b/luamml-convert.lua index fe529de..abb6615 100644 --- a/luamml-convert.lua +++ b/luamml-convert.lua @@ -370,7 +370,8 @@ local function radical_to_table(radical, sub, cur_style, text_families) elem, core = {[0] = 'msqrt', nucleus, }, nil elseif kind == 'uroot' then -- FIXME: Check that this is really a root - elem, core = {[0] = 'msqrt', nucleus, kernel_to_table(radical.degree, 7, text_families)}, nil + -- UF 2024-12-04: force use of only one return value + elem, core = {[0] = 'mroot', nucleus, (kernel_to_table(radical.degree, 7, text_families))}, nil elseif kind == 'uunderdelimiter' then elem, core = {[0] = 'munder', left, nucleus}, left elseif kind == 'uoverdelimiter' then diff --git a/testfiles-lua/test_sqrt-xml.mlr b/testfiles-lua/test_sqrt-xml.mlr new file mode 100644 index 0000000..361f864 --- /dev/null +++ b/testfiles-lua/test_sqrt-xml.mlr @@ -0,0 +1,33 @@ + + + ๐‘ฅ + + + + + + ๐‘ฅ + + + + + 2 + + + ๐‘ฅ + = + + + + ๐‘ฆ + 2 + + 3 + + + + + + ๐‘ฆ + 3 + + diff --git a/testfiles-lua/test_sqrt-xml.mlt b/testfiles-lua/test_sqrt-xml.mlt new file mode 100644 index 0000000..36a3751 --- /dev/null +++ b/testfiles-lua/test_sqrt-xml.mlt @@ -0,0 +1,28 @@ +\DocumentMetadata{ + uncompress, + pdfversion = 2.0, + testphase = {phase-III,table,math}, +} +\input{regression-test} +\documentclass{article} +\usepackage{unicode-math} + +\begin{document} +\ExplSyntaxOn +\luamml_set_filename:n { + \jobname .mml + } +\luamml_process: +\luamml_begin_single_file: +\ExplSyntaxOff + +$ \sqrt{x} $ + +$ \sqrt{\sqrt{x}} + 2 $ + +$ x = \sqrt{\sqrt[3]{y^2}} $ + +$\sqrt[3]{y}$ +\end{document} + + diff --git a/testfiles-lua/test_sqrt.pvt b/testfiles-lua/test_sqrt.pvt new file mode 100644 index 0000000..c299491 --- /dev/null +++ b/testfiles-lua/test_sqrt.pvt @@ -0,0 +1,22 @@ +\ExplSyntaxOn +\sys_gset_rand_seed:n{42} +\ExplSyntaxOff +\DocumentMetadata{ + uncompress, + pdfversion = 2.0, + testphase = {phase-III,math,table}, +} +\input{regression-test} +\documentclass{article} +\usepackage{unicode-math} +\tagpdfsetup{math/mathml/structelem} +\begin{document} + +$ \sqrt{x} $ + +$ \sqrt{\sqrt{x}} + 2 $ + +$ x = \sqrt{\sqrt[3]{y^2}} $ + +$\sqrt[3]{y}$ +\end{document} diff --git a/testfiles-lua/test_sqrt.tpf b/testfiles-lua/test_sqrt.tpf new file mode 100644 index 0000000..5b360d5 --- /dev/null +++ b/testfiles-lua/test_sqrt.tpf @@ -0,0 +1,990 @@ +%PDF-2.0 +%ฬีมิลุะฤฦ +22 0 obj +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 88 >> +stream + ๐‘ฅ +endstream +endobj +23 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-1) /F (mathml-1.xml) /UF /EF<> >> +endobj +24 0 obj +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 161 >> +stream + ๐‘ฅ + 2 +endstream +endobj +25 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-2) /F (mathml-2.xml) /UF /EF<> >> +endobj +26 0 obj +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 201 >> +stream + ๐‘ฅ = ๐‘ฆ 2 3 +endstream +endobj +27 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-3) /F (mathml-3.xml) /UF /EF<> >> +endobj +28 0 obj +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 99 >> +stream + ๐‘ฆ 3 +endstream +endobj +29 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-4) /F (mathml-4.xml) /UF /EF<> >> +endobj +35 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 11 >> +stream +$\sqrt {x}$ +endstream +endobj +36 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile1.tex) /UF /EF<> >> +endobj +43 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 23 >> +stream +$\sqrt {\sqrt {x}} + 2$ +endstream +endobj +44 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile2.tex) /UF /EF<> >> +endobj +50 0 obj +<< /O/NSO/NS 13 0 R/lspace(0.222em)/rspace(0.222em) >> +endobj +55 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 28 >> +stream +$x = \sqrt {\sqrt [3]{y^2}}$ +endstream +endobj +56 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile3.tex) /UF /EF<> >> +endobj +60 0 obj +<< /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0.278em) >> +endobj +70 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 14 >> +stream +$\sqrt [3]{y}$ +endstream +endobj +71 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile4.tex) /UF /EF<> >> +endobj +76 0 obj +<< /Type /Metadata /Subtype /XML /Length 11691 >> +stream + + + + + + + + XMP Media Management Schema + xmpMM + http://ns.adobe.com/xap/1.0/mm/ + + + + OriginalDocumentID + URI + internal + The common identifier for all versions and renditions of a document. + + + + + + PDF/A Identification Schema + pdfaid + http://www.aiim.org/pdfa/ns/id/ + + + + year + Integer + internal + Year of standard + + + rev + Integer + internal + Revision year of standard + + + + + + PDF/UA Universal Accessibility Schema + pdfuaid + http://www.aiim.org/pdfua/ns/id/ + + + + part + Integer + internal + Part of ISO 14289 standard + + + rev + Integer + internal + Revision of ISO 14289 standard + + + + + + PDF/X ID Schema + pdfxid + http://www.npes.org/pdfx/ns/id/ + + + + GTS_PDFXVersion + Text + internal + ID of PDF/X standard + + + + + + PRISM Basic Metadata + prism + http://prismstandard.org/namespaces/basic/3.0/ + + + + complianceProfile + Text + internal + PRISM specification compliance profile to which this document adheres + + + publicationName + Text + external + Publication name + + + aggregationType + Text + external + Publication type + + + bookEdition + Text + external + Edition of the book in which the document was published + + + volume + Text + external + Publication volume number + + + number + Text + external + Publication issue number within a volume + + + pageRange + Text + external + Page range for the document within the print version of its publication + + + issn + Text + external + ISSN for the printed publication in which the document was published + + + eIssn + Text + external + ISSN for the electronic publication in which the document was published + + + isbn + Text + external + ISBN for the publication in which the document was published + + + doi + Text + external + Digital Object Identifier for the document + + + url + URL + external + URL at which the document can be found + + + byteCount + Integer + internal + Approximate file size in octets + + + pageCount + Integer + internal + Number of pages in the print version of the document + + + subtitle + Text + external + Document's subtitle + + + + + + + luahbtex-NN.NN.NN + 2.0 + + + Text + + + + + en + + + + + 2016-05-20T09:00:00Z + + + application/pdf + test_sqrt.tex + LaTeX + 2016-05-20T09:00:00Z + 2016-05-20T09:00:00Z + 2016-05-20T09:00:00Z + uuid:d1433a12-c113-44c0-8c00-afe828e37deb + uuid:0a57c455-157a-4141-8c19-6237d832fc80 + three + 1 + + + + +endstream +endobj +79 0 obj +<< /Length 2081 >> +stream +/opacity1 gs +/Artifact BMC +EMC +/Formula<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 148.712 664.413 Tm [<0C05>]TJ +ET +q +1 0 0 1 157.011 664.613 cm +[] 0 d 0 J 0.398 w 0 0 m 5.699 0 l S +Q +EMC +/mi<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 157.011 657.235 Tm [<0527>]TJ +ET +EMC +/Artifact BMC +EMC +/Formula<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 148.712 644.986 Tm [<0C09>]TJ +ET +q +1 0 0 1 158.675 653.255 cm +[] 0 d 0 J 0.398 w 0 0 m 13.998 0 l S +Q +BT +/F20 9.96264 Tf +1 0 0 1 158.675 651.412 Tm [<0C05>]TJ +ET +q +1 0 0 1 166.974 651.611 cm +[] 0 d 0 J 0.398 w 0 0 m 5.699 0 l S +Q +EMC +/mi<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 166.974 644.234 Tm [<0527>]TJ +ET +EMC +/mo<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 174.886 644.234 Tm [<000C>]TJ +ET +EMC +/mn<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 184.851 644.234 Tm [<0013>]TJ +ET +EMC +/Artifact BMC +EMC +/Formula<> BDC +EMC +/mi<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 148.712 627.309 Tm [<0527>]TJ +ET +EMC +/mo<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 157.178 627.309 Tm [<001E>]TJ +ET +EMC +/Formula<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 167.697 628.648 Tm [<0C0A>]TJ +ET +q +1 0 0 1 177.659 639.905 cm +[] 0 d 0 J 0.398 w 0 0 m 20.272 0 l S +Q +EMC +/mn<> BDC +BT +/F22 4.98132 Tf +1 0 0 1 180.429 631.686 Tm [<0258>]TJ +ET +EMC +/Formula<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 178.282 628 Tm [<0C09>]TJ +ET +q +1 0 0 1 188.244 636.269 cm +[] 0 d 0 J 0.398 w 0 0 m 9.687 0 l S +Q +EMC +/mi<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 188.244 627.309 Tm [<0528>]TJ +ET +EMC +/mn<> BDC +BT +/F21 6.97385 Tf +1 0 0 1 193.405 630.188 Tm [<03F5>]TJ +ET +EMC +/Artifact BMC +EMC +/Formula<> BDC +EMC +/mn<> BDC +BT +/F22 4.98132 Tf +1 0 0 1 151.482 616.792 Tm [<0258>]TJ +ET +EMC +/Formula<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 149.335 620.379 Tm [<0C05>]TJ +ET +q +1 0 0 1 157.634 620.578 cm +[] 0 d 0 J 0.398 w 0 0 m 4.882 0 l S +Q +EMC +/mi<> BDC +BT +/F20 9.96264 Tf +1 0 0 1 157.634 614.167 Tm [<0528>]TJ +ET +EMC +/Artifact BMC +EMC +/Artifact BMC +BT +/F15 9.96264 Tf +1 0 0 1 303.133 89.365 Tm [<0052>]TJ +ET +EMC +/Artifact BMC +EMC +endstream +endobj +78 0 obj +<< /Type /Page /Contents 79 0 R /Resources 77 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 84 0 R >> +endobj +77 0 obj +<< /ExtGState 1 0 R /Font << /F20 80 0 R /F22 81 0 R /F21 82 0 R /F15 83 0 R >> >> +endobj +1 0 obj +<< /opacity1 <> >> +endobj +85 0 obj +<< /Marked true >> +endobj +86 0 obj +<< /Names[(l3ef0001) 23 0 R (l3ef0002) 25 0 R (l3ef0003) 27 0 R (l3ef0004) 29 0 R] >> +endobj +6 0 obj +<< /Nums [0 [ 34 0 R 39 0 R 42 0 R 48 0 R 49 0 R 51 0 R 54 0 R 58 0 R 59 0 R 54 0 R 66 0 R 54 0 R 64 0 R 65 0 R 69 0 R 75 0 R 69 0 R 74 0 R] +] >> +endobj +87 0 obj +<< /Limits [(ID.002) (ID.038)]/Names [(ID.002) 21 0 R (ID.003) 30 0 R (ID.004) 31 0 R (ID.005) 32 0 R (ID.006) 33 0 R (ID.007) 34 0 R (ID.008) 37 0 R (ID.009) 38 0 R (ID.010) 39 0 R (ID.011) 40 0 R (ID.012) 41 0 R (ID.013) 42 0 R (ID.014) 45 0 R (ID.015) 46 0 R (ID.016) 47 0 R (ID.017) 48 0 R (ID.018) 49 0 R (ID.019) 51 0 R (ID.020) 52 0 R (ID.021) 53 0 R (ID.022) 54 0 R (ID.023) 57 0 R (ID.024) 58 0 R (ID.025) 59 0 R (ID.026) 61 0 R (ID.027) 62 0 R (ID.028) 63 0 R (ID.029) 64 0 R (ID.030) 65 0 R (ID.031) 66 0 R (ID.032) 67 0 R (ID.033) 68 0 R (ID.034) 69 0 R (ID.035) 72 0 R (ID.036) 73 0 R (ID.037) 74 0 R (ID.038) 75 0 R ] >> +endobj +88 0 obj +<< /Kids [87 0 R] >> +endobj +7 0 obj +<< /Artifact /NonStruct /DocumentFragment /Art /Aside /Note /H7 /H6 /H8 /H6 /H9 /H6 /H10 /H6 /Title /P /FENote /Note /Sub /Span /Em /Span /Strong /Span /title /P /part /P /section /H1 /subsection /H2 /subsubsection /H3 /paragraph /H4 /subparagraph /H5 /list /L /itemize /L /enumerate /L /description /L /quote /BlockQuote /quotation /BlockQuote /verbatim /P /item /LI /itemlabel /Lbl /itembody /LBody /footnote /Note /footnotemark /Lbl /footnotelabel /Lbl /text-unit /Part /text /P /theorem-like /Sect /codeline /Span /float /Note /figures /Sect /tables /Sect >> +endobj +89 0 obj +<< /justify <> +/inline <> +/TH-both <> +/TH-row <> +/TH-col <> + >> +endobj +9 0 obj +<< /Type /Namespace /NS (http://iso.org/pdf/ssn) >> +endobj +11 0 obj +<< /Type /Namespace /NS (http://iso.org/pdf2/ssn) >> +endobj +13 0 obj +<< /Type /Namespace /NS (http://www.w3.org/1998/Math/MathML) >> +endobj +16 0 obj +<< /title [/Title 11 0 R] /part [/Title 11 0 R] /section [/H1 11 0 R] /subsection [/H2 11 0 R] /subsubsection [/H3 11 0 R] /paragraph [/H4 11 0 R] /subparagraph [/H5 11 0 R] /list [/L 11 0 R] /itemize [/L 11 0 R] /enumerate [/L 11 0 R] /description [/L 11 0 R] /quote [/BlockQuote 9 0 R] /quotation [/BlockQuote 9 0 R] /verbatim [/P 11 0 R] /item [/LI 11 0 R] /itemlabel [/Lbl 11 0 R] /itembody [/LBody 11 0 R] /footnote [/FENote 11 0 R] /footnotemark [/Lbl 11 0 R] /footnotelabel [/Lbl 11 0 R] /text-unit [/Part 11 0 R] /text [/P 11 0 R] /theorem-like [/Sect 11 0 R] /codeline [/Sub 11 0 R] /float [/Aside 11 0 R] /figures [/Sect 11 0 R] /tables [/Sect 11 0 R] >> +endobj +15 0 obj +<< /Type /Namespace /NS (https://www.latex-project.org/ns/dflt/2022) /RoleMapNS 16 0 R >> +endobj +18 0 obj +<< /chapter [/H1 11 0 R] /section [/H2 11 0 R] /subsection [/H3 11 0 R] /subsubsection [/H4 11 0 R] /paragraph [/H5 11 0 R] /subparagraph [/H6 11 0 R] >> +endobj +17 0 obj +<< /Type /Namespace /NS (https://www.latex-project.org/ns/book/2022) /RoleMapNS 18 0 R >> +endobj +19 0 obj +<< /Type /Namespace /NS (data:,C9B55C18-275C-494E-C10F-E4B83CD03F23) >> +endobj +8 0 obj +[ 9 0 R 11 0 R 13 0 R 15 0 R 17 0 R 19 0 R ] +endobj +21 0 obj +<< /Type /StructElem /S /Document /NS 11 0 R /P 5 0 R /K [32 0 R 40 0 R 52 0 R 67 0 R] /ID (ID.002) >> +endobj +30 0 obj +<< /Type /StructElem /S /Artifact /NS 15 0 R /P 5 0 R /ID (ID.003) >> +endobj +31 0 obj +<< /Type /StructElem /S /Artifact /NS 15 0 R /P 5 0 R /ID (ID.004) >> +endobj +32 0 obj +<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 33 0 R /ID (ID.005) >> +endobj +33 0 obj +<< /Type /StructElem /C /justify /S /text /NS 15 0 R /P 32 0 R /K [ 34 0 R ] /ID (ID.006) >> +endobj +34 0 obj +<< /Type /StructElem /C /inline /AF [23 0 R 36 0 R] /T /S /Formula /NS 11 0 R /P 33 0 R /K [<> 37 0 R] /ID (ID.007) >> +endobj +37 0 obj +<< /Type /StructElem /S /math /NS 13 0 R /P 34 0 R /K 38 0 R /ID (ID.008) >> +endobj +38 0 obj +<< /Type /StructElem /S /msqrt /NS 13 0 R /P 37 0 R /K 39 0 R /ID (ID.009) >> +endobj +39 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 38 0 R /K <> /ID (ID.010) >> +endobj +40 0 obj +<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 41 0 R /ID (ID.011) >> +endobj +41 0 obj +<< /Type /StructElem /C /justify /S /text /NS 15 0 R /P 40 0 R /K [ 42 0 R ] /ID (ID.012) >> +endobj +42 0 obj +<< /Type /StructElem /C /inline /AF [25 0 R 44 0 R] /T /S /Formula /NS 11 0 R /P 41 0 R /K [<> 45 0 R] /ID (ID.013) >> +endobj +45 0 obj +<< /Type /StructElem /S /math /NS 13 0 R /P 42 0 R /K [46 0 R 49 0 R 51 0 R] /ID (ID.014) >> +endobj +46 0 obj +<< /Type /StructElem /S /msqrt /NS 13 0 R /P 45 0 R /K 47 0 R /ID (ID.015) >> +endobj +47 0 obj +<< /Type /StructElem /S /msqrt /NS 13 0 R /P 46 0 R /K 48 0 R /ID (ID.016) >> +endobj +48 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 47 0 R /K <> /ID (ID.017) >> +endobj +49 0 obj +<< /Type /StructElem /A 50 0 R /S /mo /NS 13 0 R /P 45 0 R /K <> /ID (ID.018) >> +endobj +51 0 obj +<< /Type /StructElem /S /mn /NS 13 0 R /P 45 0 R /K <> /ID (ID.019) >> +endobj +52 0 obj +<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 53 0 R /ID (ID.020) >> +endobj +53 0 obj +<< /Type /StructElem /C /justify /S /text /NS 15 0 R /P 52 0 R /K [ 54 0 R ] /ID (ID.021) >> +endobj +54 0 obj +<< /Type /StructElem /C /inline /AF [27 0 R 56 0 R] /T /S /Formula /NS 11 0 R /P 53 0 R /K [<> <> <> 57 0 R] /ID (ID.022) >> +endobj +57 0 obj +<< /Type /StructElem /S /math /NS 13 0 R /P 54 0 R /K [58 0 R 59 0 R 61 0 R] /ID (ID.023) >> +endobj +58 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 57 0 R /K <> /ID (ID.024) >> +endobj +59 0 obj +<< /Type /StructElem /A 60 0 R /S /mo /NS 13 0 R /P 57 0 R /K <> /ID (ID.025) >> +endobj +61 0 obj +<< /Type /StructElem /S /msqrt /NS 13 0 R /P 57 0 R /K 62 0 R /ID (ID.026) >> +endobj +62 0 obj +<< /Type /StructElem /S /mroot /NS 13 0 R /P 61 0 R /K [63 0 R 66 0 R] /ID (ID.027) >> +endobj +63 0 obj +<< /Type /StructElem /S /msup /NS 13 0 R /P 62 0 R /K [64 0 R 65 0 R] /ID (ID.028) >> +endobj +64 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 63 0 R /K <> /ID (ID.029) >> +endobj +65 0 obj +<< /Type /StructElem /S /mn /NS 13 0 R /P 63 0 R /K <> /ID (ID.030) >> +endobj +66 0 obj +<< /Type /StructElem /S /mn /NS 13 0 R /P 62 0 R /K <> /ID (ID.031) >> +endobj +67 0 obj +<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 68 0 R /ID (ID.032) >> +endobj +68 0 obj +<< /Type /StructElem /C /justify /S /text /NS 15 0 R /P 67 0 R /K [ 69 0 R ] /ID (ID.033) >> +endobj +69 0 obj +<< /Type /StructElem /C /inline /AF [29 0 R 71 0 R] /T /S /Formula /NS 11 0 R /P 68 0 R /K [<> <> 72 0 R] /ID (ID.034) >> +endobj +72 0 obj +<< /Type /StructElem /S /math /NS 13 0 R /P 69 0 R /K 73 0 R /ID (ID.035) >> +endobj +73 0 obj +<< /Type /StructElem /S /mroot /NS 13 0 R /P 72 0 R /K [74 0 R 75 0 R] /ID (ID.036) >> +endobj +74 0 obj +<< /Type /StructElem /S /mi /NS 13 0 R /P 73 0 R /K <> /ID (ID.037) >> +endobj +75 0 obj +<< /Type /StructElem /S /mn /NS 13 0 R /P 73 0 R /K <> /ID (ID.038) >> +endobj +5 0 obj +<< /Type /StructTreeRoot /Namespaces 8 0 R /IDTree 88 0 R /ClassMap 89 0 R /ParentTree 6 0 R /RoleMap 7 0 R /K 21 0 R >> +endobj +90 0 obj +[ 82 [ 500 ] ] +endobj +92 0 obj +<< /Subtype /CIDFontType0C /Length 574 >> +[BINARY STREAM] +endobj +91 0 obj +<< /Type /FontDescriptor /FontName /JFRMQG+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 92 0 R >> +endobj +93 0 obj +<< /Length 692 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-JFRMQG-LMRoman10-Regular-0) +%%Title: (TeX-JFRMQG-LMRoman10-Regular-0 TeX JFRMQG-LMRoman10-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (JFRMQG-LMRoman10-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-JFRMQG-LMRoman10-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +1 beginbfchar +<0052> <0031> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj +83 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /JFRMQG+LMRoman10-Regular /DescendantFonts [ 94 0 R ] /ToUnicode 93 0 R >> +endobj +94 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /JFRMQG+LMRoman10-Regular /FontDescriptor 91 0 R /W 90 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +95 0 obj +[ 1013 [ 569 ] ] +endobj +97 0 obj +<< /Subtype /CIDFontType0C /Length 702 >> +[BINARY STREAM] +endobj +96 0 obj +<< /Type /FontDescriptor /FontName /MGWLKY+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 97 0 R >> +endobj +98 0 obj +<< /Length 722 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-MGWLKY-LatinModernMath-Regular-0) +%%Title: (TeX-MGWLKY-LatinModernMath-Regular-0 TeX MGWLKY-LatinModernMath-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (MGWLKY-LatinModernMath-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-MGWLKY-LatinModernMath-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +1 beginbfchar +<03F5> <0032> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj +82 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /MGWLKY+LatinModernMath-Regular /DescendantFonts [ 99 0 R ] /ToUnicode 98 0 R >> +endobj +99 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /MGWLKY+LatinModernMath-Regular /FontDescriptor 96 0 R /W 95 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +100 0 obj +[ 600 [ 681 ] ] +endobj +102 0 obj +<< /Subtype /CIDFontType0C /Length 743 >> +[BINARY STREAM] +endobj +101 0 obj +<< /Type /FontDescriptor /FontName /DPSGTM+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 153 /XHeight 431 /FontFile3 102 0 R >> +endobj +103 0 obj +<< /Length 722 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-DPSGTM-LatinModernMath-Regular-0) +%%Title: (TeX-DPSGTM-LatinModernMath-Regular-0 TeX DPSGTM-LatinModernMath-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (DPSGTM-LatinModernMath-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-DPSGTM-LatinModernMath-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +1 beginbfchar +<0258> <0033> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj +81 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /DPSGTM+LatinModernMath-Regular /DescendantFonts [ 104 0 R ] /ToUnicode 103 0 R >> +endobj +104 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /DPSGTM+LatinModernMath-Regular /FontDescriptor 101 0 R /W 100 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +105 0 obj +[ 12 [ 778 ] 19 [ 500 ] 30 [ 778 ] 1319 [ 572 490 ] 3077 [ 833 ] 3081 [ 1000 1000 ] ] +endobj +107 0 obj +<< /Subtype /CIDFontType0C /Length 1511 >> +[BINARY STREAM] +endobj +106 0 obj +<< /Type /FontDescriptor /FontName /NDJELI+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 107 0 R >> +endobj +108 0 obj +<< /Length 828 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-NDJELI-LatinModernMath-Regular-0) +%%Title: (TeX-NDJELI-LatinModernMath-Regular-0 TeX NDJELI-LatinModernMath-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (NDJELI-LatinModernMath-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-NDJELI-LatinModernMath-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +8 beginbfchar +<000C> <002B> +<0013> <0032> +<001E> <003D> +<0527> +<0528> +<0C05> <221A> +<0C09> <221A> +<0C0A> <221A> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj +80 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /NDJELI+LatinModernMath-Regular /DescendantFonts [ 109 0 R ] /ToUnicode 108 0 R >> +endobj +109 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /NDJELI+LatinModernMath-Regular /FontDescriptor 106 0 R /W 105 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +84 0 obj +<< /Type /Pages /Count 1 /Kids [ 78 0 R ] >> +endobj +110 0 obj +<< /EmbeddedFiles 86 0 R >> +endobj +111 0 obj +<< /Type /Catalog /Pages 84 0 R /Names 110 0 R /MarkInfo 85 0 R/Lang (en)/Metadata 76 0 R/StructTreeRoot 5 0 R >> +endobj +112 0 obj +<< /Producer (LuaTeX)/Creator (TeX)/CreationDate (D:20160520090000Z)/ModDate (D:20160520090000Z) /Trapped /False >> +endobj +xref +0 113 +0000000002 65535 f +0000017659 00000 n +0000000003 00000 f +0000000004 00000 f +0000000010 00000 f +0000025392 00000 n +0000017844 00000 n +0000018694 00000 n +0000020849 00000 n +0000019474 00000 n +0000000012 00000 f +0000019542 00000 n +0000000014 00000 f +0000019612 00000 n +0000000020 00000 f +0000020375 00000 n +0000019693 00000 n +0000020653 00000 n +0000020482 00000 n +0000020760 00000 n +0000000000 00000 f +0000020910 00000 n +0000000020 00000 n +0000000257 00000 n +0000000444 00000 n +0000000754 00000 n +0000000941 00000 n +0000001291 00000 n +0000001478 00000 n +0000001726 00000 n +0000021031 00000 n +0000021119 00000 n +0000021207 00000 n +0000021307 00000 n +0000021418 00000 n +0000001913 00000 n +0000002067 00000 n +0000021610 00000 n +0000021705 00000 n +0000021801 00000 n +0000021922 00000 n +0000022022 00000 n +0000022133 00000 n +0000002267 00000 n +0000002433 00000 n +0000022325 00000 n +0000022436 00000 n +0000022532 00000 n +0000022628 00000 n +0000022749 00000 n +0000002633 00000 n +0000022881 00000 n +0000023002 00000 n +0000023102 00000 n +0000023213 00000 n +0000002704 00000 n +0000002875 00000 n +0000023474 00000 n +0000023585 00000 n +0000023706 00000 n +0000003075 00000 n +0000023838 00000 n +0000023934 00000 n +0000024039 00000 n +0000024143 00000 n +0000024265 00000 n +0000024387 00000 n +0000024509 00000 n +0000024609 00000 n +0000024720 00000 n +0000003146 00000 n +0000003303 00000 n +0000024948 00000 n +0000025043 00000 n +0000025148 00000 n +0000025270 00000 n +0000003503 00000 n +0000017560 00000 n +0000017425 00000 n +0000015284 00000 n +0000034805 00000 n +0000031616 00000 n +0000029375 00000 n +0000027191 00000 n +0000035176 00000 n +0000017706 00000 n +0000017742 00000 n +0000018006 00000 n +0000018657 00000 n +0000019273 00000 n +0000025529 00000 n +0000026218 00000 n +0000025560 00000 n +0000026439 00000 n +0000027345 00000 n +0000027545 00000 n +0000028364 00000 n +0000027578 00000 n +0000028593 00000 n +0000029535 00000 n +0000029741 00000 n +0000030602 00000 n +0000029774 00000 n +0000030833 00000 n +0000031778 00000 n +0000031987 00000 n +0000033686 00000 n +0000032090 00000 n +0000033916 00000 n +0000034967 00000 n +0000035238 00000 n +0000035283 00000 n +0000035414 00000 n +trailer +<< /Size 113 /Root 111 0 R /Info 112 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> +startxref +35547 +%%EOF From 20a2572e1273c88e65d95c4e082018a34ef8e95c Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Wed, 4 Dec 2024 19:46:17 +0100 Subject: [PATCH 142/206] what fails?? --- testfiles-lua/{test_struct.pvt => test_struct.lvt} | 0 testfiles-lua/{test_struct.tpf => test_struct.tlg} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename testfiles-lua/{test_struct.pvt => test_struct.lvt} (100%) rename testfiles-lua/{test_struct.tpf => test_struct.tlg} (100%) diff --git a/testfiles-lua/test_struct.pvt b/testfiles-lua/test_struct.lvt similarity index 100% rename from testfiles-lua/test_struct.pvt rename to testfiles-lua/test_struct.lvt diff --git a/testfiles-lua/test_struct.tpf b/testfiles-lua/test_struct.tlg similarity index 100% rename from testfiles-lua/test_struct.tpf rename to testfiles-lua/test_struct.tlg From 1cd6cc4da42b27a666290ec29e7f9eb68558cfdb Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Mon, 9 Dec 2024 11:57:59 +0100 Subject: [PATCH 143/206] add artifact socket --- luamml.dtx | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/luamml.dtx b/luamml.dtx index 5134062..9fdea4c 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -564,6 +564,28 @@ \AssignSocketPlug{tagsupport/math/luamml/hbox}{luamml} % % \end{macrocode} +% +% \subsubsection{Artifact characters} +% Unicode characters like a root sign should be marked as artifacts +% to avoid duplication e.g. in derivation if mathml +% structure elements are used that imply the meaning. +% We test for the socket until the release 2025-06-01. +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/artifact_plug_str } + { + \NewSocket{tagsupport/math/luamml/artifact}{0} + } +%<*luatex> +\NewSocketPlug{tagsupport/math/luamml/artifact}{default} + { + \int_if_odd:nT { \int_div_truncate:nn { \l__luamml_flag_int } { 8 } } + { + \tag_mc_begin:n{artifact} + } + } +\AssignSocketPlug{tagsupport/math/luamml/hbox}{luamml} +% +% \end{macrocode} % \subsection{Patching} % For some packages, we ship with patches to make them more compatible and to % demonstrate how other code can be patched to work with \texttt{luamml}. From 04da7fc19890e16130818b57e4fd2ba0378f41ac Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Mon, 9 Dec 2024 11:58:23 +0100 Subject: [PATCH 144/206] docu and spaces --- luamml.dtx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/luamml.dtx b/luamml.dtx index 9fdea4c..db97f80 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -527,8 +527,8 @@ % In various places luamml has to add code to kernel commands. This is done through % sockets which are predeclared in lttagging. % -% \subsubsection{mbox} -% This socket annotates an \cs{hbox} inside box command use in math. +% \subsubsection{Horizontal boxes} +% This socket annotates an \cs{hbox} inside box commands used in math. % We test for the socket until the release 2025-06-01. % \begin{macrocode} \str_if_exist:cF { l__socket_tagsupport/math/luamml/hbox_plug_str } @@ -566,8 +566,8 @@ % \end{macrocode} % % \subsubsection{Artifact characters} -% Unicode characters like a root sign should be marked as artifacts -% to avoid duplication e.g. in derivation if mathml +% Unicode characters like a root sign should be marked as artifacts +% to avoid duplication e.g. in derivation if mathml % structure elements are used that imply the meaning. % We test for the socket until the release 2025-06-01. % \begin{macrocode} @@ -578,7 +578,7 @@ %<*luatex> \NewSocketPlug{tagsupport/math/luamml/artifact}{default} { - \int_if_odd:nT { \int_div_truncate:nn { \l__luamml_flag_int } { 8 } } + \int_if_odd:nT { \int_div_truncate:nn { \l__luamml_flag_int } { 8 } } { \tag_mc_begin:n{artifact} } From 1e3b5a81d57bfe2177854121d072b1992fe8c596 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Mon, 9 Dec 2024 11:59:43 +0100 Subject: [PATCH 145/206] correct name --- luamml.dtx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luamml.dtx b/luamml.dtx index db97f80..498444f 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -583,7 +583,7 @@ \tag_mc_begin:n{artifact} } } -\AssignSocketPlug{tagsupport/math/luamml/hbox}{luamml} +\AssignSocketPlug{tagsupport/math/luamml/artifact}{default} % % \end{macrocode} % \subsection{Patching} From c53fb2a9562052419ae1dc746d04f2122aea4bc0 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Mon, 9 Dec 2024 16:05:33 +0100 Subject: [PATCH 146/206] correct extension --- testfiles-lua/{test_struct.lvt => test_struct.pvt} | 0 testfiles-lua/{test_struct.tlg => test_struct.tpf} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename testfiles-lua/{test_struct.lvt => test_struct.pvt} (100%) rename testfiles-lua/{test_struct.tlg => test_struct.tpf} (100%) diff --git a/testfiles-lua/test_struct.lvt b/testfiles-lua/test_struct.pvt similarity index 100% rename from testfiles-lua/test_struct.lvt rename to testfiles-lua/test_struct.pvt diff --git a/testfiles-lua/test_struct.tlg b/testfiles-lua/test_struct.tpf similarity index 100% rename from testfiles-lua/test_struct.tlg rename to testfiles-lua/test_struct.tpf From a2fa1d4dcf1f016a3521d490db76a9bba1e02635 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Wed, 11 Dec 2024 15:02:56 +0100 Subject: [PATCH 147/206] move actualtext to the mc-chunk --- CHANGELOG.md | 3 +++ luamml-structelemwriter.lua | 17 +++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92c0112..9b2213f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] ### Changed +- Ulrike Fischer, 2024-11-29 + luamml-structelemwriter.lua: moved the actualtext for e.g. stretched braces from the structure element to the mc-chunk. + - Ulrike Fischer, 2024-03-03 luamml.dtx: add plug for mbox socket to correctly annotate them in math. diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index 36881e1..957c29f 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -70,7 +70,7 @@ local function write_elem(tree, stash) return tex.runtoks(function() return tex.sprint(struct_use_num, '{', tree[':structnum'], '}') end) - end + end if not tree[0] then print('ERR', require'inspect'(tree)) end local i = 0 for attr, val in next, tree do if type(attr) == 'string' and not string.find(attr, ':') and attr ~= 'xmlns' then @@ -81,7 +81,7 @@ local function write_elem(tree, stash) table.sort(attrs) if stash then - tree[':structnum'] = get_ltx().tag.get_struct_num_next() + tree[':structnum'] = get_ltx().tag.get_struct_num_next() stash = ', stash, ' end @@ -89,18 +89,19 @@ local function write_elem(tree, stash) tex.sprint(struct_begin, '{tag=' .. tree[0] .. '/mathml') if stash then tex.sprint(stash) end if attr_flag then tex.sprint(attr_flag) end - if tree[':actual'] then - tex.sprint(', actualtext = {') - tex.cprint(12, tree[':actual']) - tex.sprint'}' - end tex.sprint'}' for j = 1, i do attrs[j] = nil end if tree[':nodes'] then local n = tree[':nodes'] tex.runtoks(function() - tex.sprint{mc_begin, string.format('{tag=%s}', tree[0])} + if tree[':actual'] then + tex.sprint(mc_begin,'{tag=Span,actualtext=') + tex.cprint(12,tree[':actual']) + tex.sprint('}') + else + tex.sprint{mc_begin, string.format('{tag=%s}', tree[0])} + end -- NOTE: This will also flush all previous sprint's... That's often annoying, but in this case actually intentional. end) local mct, mcc = tex.attribute[mc_type], tex.attribute[mc_cnt] From dc22fa31a4ae754e3e298e99507f6ce3bf536cc1 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Wed, 11 Dec 2024 15:08:23 +0100 Subject: [PATCH 148/206] update test --- testfiles-lua/test_struct.tpf | 460 +++++++++++++++++----------------- 1 file changed, 230 insertions(+), 230 deletions(-) diff --git a/testfiles-lua/test_struct.tpf b/testfiles-lua/test_struct.tpf index 520c6ad..4149ac6 100644 --- a/testfiles-lua/test_struct.tpf +++ b/testfiles-lua/test_struct.tpf @@ -373,7 +373,7 @@ stream endstream endobj 225 0 obj -<< /Length 8308 >> +<< /Length 8458 >> stream /opacity1 gs /Artifact BMC @@ -384,7 +384,7 @@ BT 1 0 0 1 148.712 657.235 Tm [<003F0032004800480051>]TJ ET EMC -/mo<> BDC +/Span<>> BDC BT /F20 9.96264 Tf 1 0 0 1 244.283 627.612 Tm [<09C9>]TJ @@ -474,7 +474,7 @@ ET EMC /Artifact BMC EMC -/mo<> BDC +/Span<>> BDC BT /F20 9.96264 Tf 1 0 0 1 287.87 627.612 Tm [<09CC>]TJ @@ -488,7 +488,7 @@ BT 1 0 0 1 299.355 623.861 Tm [<001E>]TJ ET EMC -/mo<> BDC +/Span<>> BDC BT /F20 9.96264 Tf 1 0 0 1 309.873 623.861 Tm [<09D3>]TJ @@ -670,7 +670,7 @@ q [] 0 d 0 J 0.398 w 0 0 m 4.314 0 l S Q EMC -/mo<> BDC +/Span<>> BDC BT /F20 9.96264 Tf 1 0 0 1 313.902 556.718 Tm [<06FE>]TJ @@ -794,7 +794,7 @@ EMC EMC /Formula<> BDC EMC -/mo<> BDC +/Span<>> BDC BT /F20 9.96264 Tf 1 0 0 1 216.637 493.954 Tm [<0997>]TJ @@ -832,7 +832,7 @@ BT 1 0 0 1 258.669 493.954 Tm [<0014>]TJ ET EMC -/mo<> BDC +/Span<>> BDC BT /F20 9.96264 Tf 1 0 0 1 263.65 493.954 Tm [<0998>]TJ @@ -1167,7 +1167,7 @@ endobj << /Type /StructElem /S /mrow /NS 13 0 R /P 71 0 R /K [74 0 R 76 0 R 78 0 R 84 0 R 85 0 R] /ID (ID.0040) >> endobj 74 0 obj -<< /Type /StructElem /A 75 0 R /ActualText /S /mo /NS 13 0 R /P 73 0 R /K <> /ID (ID.0041) >> +<< /Type /StructElem /A 75 0 R /S /mo /NS 13 0 R /P 73 0 R /K <> /ID (ID.0041) >> endobj 76 0 obj << /Type /StructElem /A 77 0 R /S /mspace /NS 13 0 R /P 73 0 R /ID (ID.0042) >> @@ -1191,7 +1191,7 @@ endobj << /Type /StructElem /A 77 0 R /S /mspace /NS 13 0 R /P 73 0 R /ID (ID.0048) >> endobj 85 0 obj -<< /Type /StructElem /A 75 0 R /ActualText /S /mo /NS 13 0 R /P 73 0 R /K <> /ID (ID.0049) >> +<< /Type /StructElem /A 75 0 R /S /mo /NS 13 0 R /P 73 0 R /K <> /ID (ID.0049) >> endobj 86 0 obj << /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 71 0 R /K <> /ID (ID.0050) >> @@ -1200,7 +1200,7 @@ endobj << /Type /StructElem /S /mrow /NS 13 0 R /P 71 0 R /K [88 0 R 89 0 R 93 0 R] /ID (ID.0051) >> endobj 88 0 obj -<< /Type /StructElem /A 75 0 R /ActualText /S /mo /NS 13 0 R /P 87 0 R /K <> /ID (ID.0052) >> +<< /Type /StructElem /A 75 0 R /S /mo /NS 13 0 R /P 87 0 R /K <> /ID (ID.0052) >> endobj 89 0 obj << /Type /StructElem /A 79 0 R /S /mpadded /NS 13 0 R /P 87 0 R /K 90 0 R /ID (ID.0053) >> @@ -1320,7 +1320,7 @@ endobj << /Type /StructElem /S /mi /NS 13 0 R /P 135 0 R /K <> /ID (ID.0091) >> endobj 137 0 obj -<< /Type /StructElem /A 138 0 R /ActualText /S /mo /NS 13 0 R /P 135 0 R /K <> /ID (ID.0092) >> +<< /Type /StructElem /A 138 0 R /S /mo /NS 13 0 R /P 135 0 R /K <> /ID (ID.0092) >> endobj 139 0 obj << /Type /StructElem /S /msup /NS 13 0 R /P 127 0 R /K [140 0 R 141 0 R] /ID (ID.0093) >> @@ -1407,7 +1407,7 @@ endobj << /Type /StructElem /S /mtd /NS 13 0 R /P 199 0 R /K [171 0 R 173 0 R 174 0 R 175 0 R] /ID (ID.0120) >> endobj 171 0 obj -<< /Type /StructElem /A 172 0 R /ActualText /S /mo /NS 13 0 R /P 170 0 R /K <> /ID (ID.0121) >> +<< /Type /StructElem /A 172 0 R /S /mo /NS 13 0 R /P 170 0 R /K <> /ID (ID.0121) >> endobj 173 0 obj << /Type /StructElem /S /mn /NS 13 0 R /P 170 0 R /K <> /ID (ID.0122) >> @@ -1431,7 +1431,7 @@ endobj << /Type /StructElem /S /mn /NS 13 0 R /P 176 0 R /K <> /ID (ID.0128) >> endobj 180 0 obj -<< /Type /StructElem /A 172 0 R /ActualText /S /mo /NS 13 0 R /P 176 0 R /K <> /ID (ID.0129) >> +<< /Type /StructElem /A 172 0 R /S /mo /NS 13 0 R /P 176 0 R /K <> /ID (ID.0129) >> endobj 181 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 199 0 R /K 182 0 R /ID (ID.0130) >> @@ -1822,27 +1822,27 @@ endobj xref 0 262 0000000002 65535 f -0000027968 00000 n +0000028118 00000 n 0000000003 00000 f 0000000004 00000 f 0000000010 00000 f -0000054820 00000 n -0000028173 00000 n -0000032141 00000 n -0000034336 00000 n -0000032961 00000 n +0000054832 00000 n +0000028323 00000 n +0000032291 00000 n +0000034486 00000 n +0000033111 00000 n 0000000012 00000 f -0000033029 00000 n +0000033179 00000 n 0000000014 00000 f -0000033099 00000 n +0000033249 00000 n 0000000020 00000 f -0000033862 00000 n -0000033180 00000 n -0000034140 00000 n -0000033969 00000 n -0000034247 00000 n -0000000000 00000 f +0000034012 00000 n +0000033330 00000 n +0000034290 00000 n +0000034119 00000 n 0000034397 00000 n +0000000000 00000 f +0000034547 00000 n 0000000020 00000 n 0000000299 00000 n 0000000486 00000 n @@ -1853,238 +1853,238 @@ xref 0000003198 00000 n 0000003385 00000 n 0000004064 00000 n -0000034536 00000 n -0000034625 00000 n -0000034714 00000 n -0000034815 00000 n -0000034952 00000 n -0000035053 00000 n +0000034686 00000 n +0000034775 00000 n +0000034864 00000 n +0000034965 00000 n +0000035102 00000 n +0000035203 00000 n 0000004251 00000 n 0000004566 00000 n -0000035339 00000 n -0000035434 00000 n -0000035557 00000 n -0000035652 00000 n -0000035775 00000 n -0000035870 00000 n -0000035993 00000 n -0000036088 00000 n -0000036211 00000 n -0000036306 00000 n -0000036429 00000 n -0000036524 00000 n -0000036647 00000 n -0000036742 00000 n -0000036866 00000 n -0000036961 00000 n -0000037085 00000 n -0000037180 00000 n -0000037304 00000 n -0000037399 00000 n -0000037523 00000 n -0000037659 00000 n -0000037771 00000 n -0000037895 00000 n +0000035489 00000 n +0000035584 00000 n +0000035707 00000 n +0000035802 00000 n +0000035925 00000 n +0000036020 00000 n +0000036143 00000 n +0000036238 00000 n +0000036361 00000 n +0000036456 00000 n +0000036579 00000 n +0000036674 00000 n +0000036797 00000 n +0000036892 00000 n +0000037016 00000 n +0000037111 00000 n +0000037235 00000 n +0000037330 00000 n +0000037454 00000 n +0000037549 00000 n +0000037673 00000 n +0000037809 00000 n +0000037921 00000 n +0000038045 00000 n 0000004766 00000 n -0000038030 00000 n -0000038154 00000 n -0000038249 00000 n -0000038344 00000 n -0000038468 00000 n -0000038595 00000 n -0000038690 00000 n +0000038180 00000 n +0000038304 00000 n +0000038399 00000 n +0000038494 00000 n +0000038618 00000 n +0000038745 00000 n +0000038840 00000 n 0000004837 00000 n -0000038813 00000 n -0000038939 00000 n +0000038963 00000 n +0000039089 00000 n 0000004891 00000 n -0000039096 00000 n +0000039223 00000 n 0000004978 00000 n -0000039195 00000 n +0000039322 00000 n 0000005033 00000 n -0000039305 00000 n -0000039419 00000 n -0000039530 00000 n -0000039641 00000 n -0000039752 00000 n -0000039851 00000 n -0000040009 00000 n -0000040144 00000 n -0000040256 00000 n -0000040414 00000 n -0000040524 00000 n -0000040631 00000 n -0000040735 00000 n -0000040839 00000 n +0000039432 00000 n +0000039546 00000 n +0000039657 00000 n +0000039768 00000 n +0000039879 00000 n +0000039978 00000 n +0000040113 00000 n +0000040248 00000 n +0000040360 00000 n +0000040495 00000 n +0000040605 00000 n +0000040712 00000 n +0000040816 00000 n +0000040920 00000 n 0000005105 00000 n -0000040938 00000 n -0000041039 00000 n +0000041019 00000 n +0000041120 00000 n 0000005159 00000 n 0000005375 00000 n -0000041291 00000 n -0000041425 00000 n -0000041550 00000 n -0000041686 00000 n -0000041795 00000 n -0000041920 00000 n +0000041372 00000 n +0000041506 00000 n +0000041631 00000 n +0000041767 00000 n +0000041876 00000 n +0000042001 00000 n 0000005575 00000 n -0000042058 00000 n -0000042184 00000 n +0000042139 00000 n +0000042265 00000 n 0000005641 00000 n -0000042322 00000 n -0000042422 00000 n -0000042555 00000 n -0000042664 00000 n -0000042790 00000 n -0000042916 00000 n -0000043054 00000 n -0000043180 00000 n -0000043306 00000 n -0000043432 00000 n -0000043541 00000 n -0000043667 00000 n -0000043793 00000 n +0000042403 00000 n +0000042503 00000 n +0000042636 00000 n +0000042745 00000 n +0000042871 00000 n +0000042997 00000 n +0000043135 00000 n +0000043261 00000 n +0000043387 00000 n +0000043513 00000 n +0000043622 00000 n +0000043748 00000 n +0000043874 00000 n 0000005713 00000 n -0000043930 00000 n -0000044033 00000 n +0000044011 00000 n +0000044114 00000 n 0000005773 00000 n 0000005978 00000 n -0000044253 00000 n -0000044389 00000 n -0000044500 00000 n +0000044334 00000 n +0000044470 00000 n +0000044581 00000 n 0000006181 00000 n -0000044638 00000 n -0000044764 00000 n -0000044875 00000 n -0000045001 00000 n -0000045087 00000 n -0000045197 00000 n -0000045323 00000 n +0000044719 00000 n +0000044845 00000 n +0000044956 00000 n +0000045082 00000 n +0000045168 00000 n +0000045278 00000 n +0000045404 00000 n 0000006267 00000 n -0000045484 00000 n -0000045593 00000 n -0000045719 00000 n +0000045542 00000 n +0000045651 00000 n +0000045777 00000 n 0000006322 00000 n -0000045857 00000 n -0000045960 00000 n +0000045915 00000 n +0000046018 00000 n 0000006382 00000 n 0000006611 00000 n -0000046263 00000 n -0000046379 00000 n -0000046505 00000 n -0000046631 00000 n -0000046757 00000 n -0000046889 00000 n -0000046975 00000 n -0000047112 00000 n -0000047238 00000 n -0000047364 00000 n -0000047490 00000 n -0000047588 00000 n -0000047697 00000 n -0000047823 00000 n -0000047932 00000 n -0000048070 00000 n -0000048196 00000 n -0000048320 00000 n -0000048406 00000 n +0000046321 00000 n +0000046437 00000 n +0000046563 00000 n +0000046689 00000 n +0000046815 00000 n +0000046947 00000 n +0000047033 00000 n +0000047170 00000 n +0000047296 00000 n +0000047422 00000 n +0000047548 00000 n +0000047646 00000 n +0000047755 00000 n +0000047881 00000 n +0000047990 00000 n +0000048128 00000 n +0000048254 00000 n +0000048378 00000 n +0000048464 00000 n 0000006814 00000 n -0000048544 00000 n -0000048682 00000 n -0000048808 00000 n -0000048935 00000 n -0000049059 00000 n +0000048602 00000 n +0000048740 00000 n +0000048866 00000 n +0000048993 00000 n +0000049117 00000 n 0000006880 00000 n -0000049220 00000 n -0000049346 00000 n -0000049484 00000 n -0000049610 00000 n -0000049734 00000 n -0000049820 00000 n -0000049957 00000 n -0000050083 00000 n -0000050244 00000 n -0000050342 00000 n -0000050428 00000 n -0000050526 00000 n -0000050612 00000 n -0000050739 00000 n -0000050837 00000 n -0000050963 00000 n -0000051061 00000 n -0000051147 00000 n -0000051245 00000 n -0000051331 00000 n -0000051429 00000 n -0000051515 00000 n -0000051642 00000 n -0000051752 00000 n +0000049255 00000 n +0000049381 00000 n +0000049519 00000 n +0000049645 00000 n +0000049769 00000 n +0000049855 00000 n +0000049992 00000 n +0000050118 00000 n +0000050256 00000 n +0000050354 00000 n +0000050440 00000 n +0000050538 00000 n +0000050624 00000 n +0000050751 00000 n +0000050849 00000 n +0000050975 00000 n +0000051073 00000 n +0000051159 00000 n +0000051257 00000 n +0000051343 00000 n +0000051441 00000 n +0000051527 00000 n +0000051654 00000 n +0000051764 00000 n 0000007004 00000 n -0000051883 00000 n -0000052007 00000 n -0000052131 00000 n -0000052255 00000 n -0000052358 00000 n -0000052545 00000 n +0000051895 00000 n +0000052019 00000 n +0000052143 00000 n +0000052267 00000 n +0000052370 00000 n +0000052557 00000 n 0000007122 00000 n 0000007293 00000 n -0000052744 00000 n -0000052949 00000 n -0000053087 00000 n +0000052756 00000 n +0000052961 00000 n +0000053099 00000 n 0000007496 00000 n -0000053225 00000 n -0000053351 00000 n -0000053489 00000 n -0000053627 00000 n -0000053765 00000 n -0000053903 00000 n -0000054029 00000 n -0000054167 00000 n -0000054293 00000 n -0000054419 00000 n -0000054557 00000 n -0000054694 00000 n +0000053237 00000 n +0000053363 00000 n +0000053501 00000 n +0000053639 00000 n +0000053777 00000 n +0000053915 00000 n +0000054041 00000 n +0000054179 00000 n +0000054305 00000 n +0000054431 00000 n +0000054569 00000 n +0000054706 00000 n 0000007572 00000 n -0000027864 00000 n -0000027725 00000 n +0000028014 00000 n +0000027875 00000 n 0000019356 00000 n -0000069914 00000 n -0000065645 00000 n -0000059321 00000 n -0000056639 00000 n -0000070274 00000 n -0000028015 00000 n -0000028052 00000 n -0000028919 00000 n -0000029831 00000 n -0000030784 00000 n -0000031746 00000 n -0000032078 00000 n -0000032720 00000 n -0000054959 00000 n -0000055668 00000 n -0000054991 00000 n -0000055891 00000 n -0000056795 00000 n -0000056997 00000 n -0000058257 00000 n -0000057070 00000 n -0000058488 00000 n -0000059484 00000 n -0000059693 00000 n -0000064151 00000 n -0000059978 00000 n -0000064381 00000 n -0000065808 00000 n -0000066017 00000 n -0000068699 00000 n -0000066203 00000 n -0000068922 00000 n -0000070071 00000 n -0000070338 00000 n -0000070384 00000 n -0000070518 00000 n +0000069926 00000 n +0000065657 00000 n +0000059333 00000 n +0000056651 00000 n +0000070286 00000 n +0000028165 00000 n +0000028202 00000 n +0000029069 00000 n +0000029981 00000 n +0000030934 00000 n +0000031896 00000 n +0000032228 00000 n +0000032870 00000 n +0000054971 00000 n +0000055680 00000 n +0000055003 00000 n +0000055903 00000 n +0000056807 00000 n +0000057009 00000 n +0000058269 00000 n +0000057082 00000 n +0000058500 00000 n +0000059496 00000 n +0000059705 00000 n +0000064163 00000 n +0000059990 00000 n +0000064393 00000 n +0000065820 00000 n +0000066029 00000 n +0000068711 00000 n +0000066215 00000 n +0000068934 00000 n +0000070083 00000 n +0000070350 00000 n +0000070396 00000 n +0000070530 00000 n trailer << /Size 262 /Root 260 0 R /Info 261 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> startxref -70651 +70663 %%EOF From 88ab616a78059ecd4f8353026f2646727da66a47 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Thu, 23 Jan 2025 18:44:57 +0100 Subject: [PATCH 149/206] move \__luamml_amsmath_finalize_table:n into socket --- luamml-patches-amsmath.sty | 9 +++++---- luamml-patches-lab-math.sty | 4 +++- luamml.dtx | 23 +++++++++++++++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 0b09bc7..68f68a8 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -160,7 +160,7 @@ \cs_set:Npn \endgather { \math@cr \black@ \totwidth@ - \__luamml_amsmath_finalize_table:n {gather} + \UseExpandableTaggingSocket{math/luamml/mtable/finalize} {gather} \egroup $$ \ignorespacesafterend @@ -258,7 +258,7 @@ \cs_set:Npn \endalign { \math@cr \black@ \totwidth@ - \__luamml_amsmath_finalize_table:n {align} + \UseTaggingSocket{math/luamml/mtable/finalize} {align} \egroup \ifingather@ \restorealignstate@ @@ -334,7 +334,7 @@ \fi \hfilneg \math@cr - \__luamml_amsmath_finalize_table:n {multline} + \UseExpandableTaggingSocket {math/luamml/mtable/finalize} {multline} \egroup $$ } @@ -343,7 +343,8 @@ \hfilneg \hskip\multlinegap \math@cr - \__luamml_amsmath_finalize_table:n {multline} + \UseExpandableTaggingSocket {math/luamml/mtable/finalize} {multline} + %\__luamml_amsmath_finalize_table:n {multline} \egroup $$ } diff --git a/luamml-patches-lab-math.sty b/luamml-patches-lab-math.sty index 7776576..f329911 100644 --- a/luamml-patches-lab-math.sty +++ b/luamml-patches-lab-math.sty @@ -1,11 +1,13 @@ \ProvidesExplPackage {luamml-patches-lab-math} {2024-10-30} {0.2.0} {Feel free to add a description here} +% This definition is identical to the one in latex-lab-math. +% The redefinition and the whole patch file can be removed in 2025-06-01 \AddToHook{begindocument} { \cs_set:Npn \common@align@ending { \math@cr \black@ \totwidth@ - \__luamml_amsmath_finalize_table:n {align} + \UseExpandableTaggingSocket{math/luamml/mtable/finalize}{align} \egroup \ifingather@ \restorealignstate@ diff --git a/luamml.dtx b/luamml.dtx index 498444f..0f98744 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -527,6 +527,29 @@ % In various places luamml has to add code to kernel commands. This is done through % sockets which are predeclared in lttagging. % +% \subsubsection{amsmath alignments} +% +% This socket finalize the \texttt{mtable} in alignments like align or gather. +% It takes an argument, the environment. +% It should be used normally with \cs{UseExpandableTaggingSocket}. +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/mtable/finalize_plug_str } + { + \NewSocket{tagsupport/math/luamml/mtable/finalize}{1} + \AssignSocketPlug{tagsupport/math/luamml/mtable/finalize}{noop} + } +% \end{macrocode} +% +% \begin{macrocode} +%<*luatex> +\NewSocketPlug{tagsupport/math/luamml/mtable/finalize}{luamml} + { + \__luamml_amsmath_finalize_table:n {#1} + } +% +% \end{macrocode} +% +% % \subsubsection{Horizontal boxes} % This socket annotates an \cs{hbox} inside box commands used in math. % We test for the socket until the release 2025-06-01. From 2fda593fae2e38378d60838f1a70f29747f822e2 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Thu, 23 Jan 2025 19:50:35 +0100 Subject: [PATCH 150/206] forgot to activate the plug --- luamml.dtx | 1 + 1 file changed, 1 insertion(+) diff --git a/luamml.dtx b/luamml.dtx index 0f98744..c492c10 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -546,6 +546,7 @@ { \__luamml_amsmath_finalize_table:n {#1} } +\AssignSocketPlug{tagsupport/math/luamml/mtable/finalize}{luamml} % % \end{macrocode} % From 57e29caf9c4693e85f4fd8ace0acf8bafd9485c1 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 24 Jan 2025 14:46:28 +0100 Subject: [PATCH 151/206] suppress patch if latex-lab-math is new enough --- luamml-patches-lab-math.sty | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/luamml-patches-lab-math.sty b/luamml-patches-lab-math.sty index f329911..c74a206 100644 --- a/luamml-patches-lab-math.sty +++ b/luamml-patches-lab-math.sty @@ -1,9 +1,13 @@ \ProvidesExplPackage {luamml-patches-lab-math} {2024-10-30} {0.2.0} {Feel free to add a description here} -% This definition is identical to the one in latex-lab-math. +% This definition is identical to the one in latex-lab-math. % The redefinition and the whole patch file can be removed in 2025-06-01 -\AddToHook{begindocument} { +\IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} + {} + { + \AddToHook{begindocument} { + \PackageInfo{luamml}{patching~\string\common@align@ending} \cs_set:Npn \common@align@ending { \math@cr \black@ \totwidth@ @@ -18,5 +22,6 @@ $$ \fi \ignorespacesafterend + } } } From cf0a3d4434080f8e8a2da5deda3e745e4c893f7f Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 24 Jan 2025 14:55:30 +0100 Subject: [PATCH 152/206] avoid warning about missing tag in gather --- luamml-patches-amsmath.sty | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 68f68a8..b9556d1 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -134,12 +134,14 @@ \strut@ {##} } - \dim_compare:nNnF {0pt} = { + \dim_compare:nNnTF {0pt} = { \box_wd:N \c_zero_int - } { + } + { \place@tag@gather } + { + \place@tag@gather \__luamml_amsmath_set_tag: } - \place@tag@gather \tabskip \iftagsleft@ \gdisplaywidth@ \else @@ -230,7 +232,7 @@ \omit \kern -\alignsep@ \iftag@ - \setboxz@h { + \setboxz@h { \@lign \strut@ { \make@display@tag } From 7e000a0db1c04b076ba5b935801d7ca9db760015 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 28 Jan 2025 00:20:06 +0100 Subject: [PATCH 153/206] use sockets for math phantoms --- luamml-patches-kernel.sty | 52 ++++++++++++++++++----------------- luamml.dtx | 57 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 24 deletions(-) diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index 38eb28b..304cf26 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -22,30 +22,34 @@ } } -\cs_set:Npn \mathph@nt #1 #2 { - \setbox \z@ = \hbox { - $ - \m@th - #1 - {#2} - \luamml_save:nNn {mathphant} #1 {mphantom} - $ - } - \luamml_annotate:nen {1} { - nucleus = true, - core = {[0] = 'mpadded', - \ifh@\else - width = 0, - \fi - \ifv@\else - height = 0, depth = 0, - \fi - consume_label'mathphant', - } - } { - \finph@nt - } -} +\IfPackageAtLeastTF{latex-lab-testphase-text}{2025-01-27} + {} + { + \cs_set:Npn \mathph@nt #1 #2 { + \setbox \z@ = \hbox { + $ + \m@th + #1 + {#2} + \luamml_save:nNn {mathphant} #1 {mphantom} + $ + } + \luamml_annotate:nen {1} { + nucleus = true, + core = {[0] = 'mpadded', + \ifh@\else + width = 0, + \fi + \ifv@\else + height = 0, depth = 0, + \fi + consume_label'mathphant', + } + } { + \finph@nt + } + } + } \@ifpackageloaded {unicode-math} {} { \cs_new:Npn \__luamml_kernel_define_character:Nnn #1#2#3 { diff --git a/luamml.dtx b/luamml.dtx index c492c10..2494975 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -527,6 +527,25 @@ % In various places luamml has to add code to kernel commands. This is done through % sockets which are predeclared in lttagging. % +% \subsubsection{Save socket} +% This socket is a wrapper around the \cs{luamml_save:nNn} command +% It should provided until 2025-06-01 +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/save_plug_str } + { + \NewSocket{tagsupport/math/luamml/save}{1} + \AssignSocketPlug{tagsupport/math/luamml/save}{noop} + } +% \end{macrocode} +% +% \begin{macrocode} +\NewSocketPlug{tagsupport/math/luamml/save}{luamml} + { + \luamml_save:nNn #1 + } +\AssignSocketPlug{tagsupport/math/luamml/save}{luamml} +% \end{macrocode} +% % \subsubsection{amsmath alignments} % % This socket finalize the \texttt{mtable} in alignments like align or gather. @@ -610,6 +629,44 @@ \AssignSocketPlug{tagsupport/math/luamml/artifact}{default} % % \end{macrocode} +% +% \subsubsection{Math phantom socket} +% This socket is used around \cs{finph@nt}. +% It should provided until 2025-06-01 +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/finph@nt_plug_str } + { + \NewSocket{tagsupport/math/luamml/finph@nt}{2} + \NewSocketPlug{tagsupport/math/luamml/finph@nt}{default}{#2} + \AssignSocketPlug{tagsupport/math/luamml/finph@nt}{default} + } +% \end{macrocode} +% +% \begin{macrocode} +%<*luatex> +\NewSocketPlug{tagsupport/math/luamml/finph@nt}{luamml} + { + \luamml_annotate:nen {1} + { + nucleus = true, + core = + { + [0] = 'mpadded', + \ifh@\else + width = 0, + \fi + \ifv@\else + height = 0, depth = 0, + \fi + consume_label'mathphant', + } + } + { #2 } + } +\AssignSocketPlug{tagsupport/math/luamml/finph@nt}{luamml} +% +% \end{macrocode} +% % \subsection{Patching} % For some packages, we ship with patches to make them more compatible and to % demonstrate how other code can be patched to work with \texttt{luamml}. From 6b34c205426197c1aa9acbb572fdfa6fffb3369f Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 28 Jan 2025 00:23:17 +0100 Subject: [PATCH 154/206] add message --- luamml-patches-kernel.sty | 1 + 1 file changed, 1 insertion(+) diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index 304cf26..01c936e 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -25,6 +25,7 @@ \IfPackageAtLeastTF{latex-lab-testphase-text}{2025-01-27} {} { + \PackageInfo{luamml}{patching~\string\mathph@nt} \cs_set:Npn \mathph@nt #1 #2 { \setbox \z@ = \hbox { $ From 585c5c75e3ba38128f22077af5b49feaa9ebb895 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 28 Jan 2025 12:40:09 +0100 Subject: [PATCH 155/206] move smash patches into sockets --- luamml-patches-kernel.sty | 44 ++++++++++++++++++++------------------- luamml.dtx | 32 +++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 22 deletions(-) diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index 01c936e..36824a8 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -1,30 +1,32 @@ \ProvidesExplPackage {luamml-patches-kernel} {2024-10-30} {0.2.0} {Feel free to add a description here} -\cs_set:Npn \mathsm@sh #1 #2 { - \setbox \z@ \hbox { - $ - \m@th #1 { - #2 - } - \luamml_save:nNn {mathsmash} #1 {mpadded} - \luamml_pdf_write: - $ - } - \luamml_annotate:nen {2} { - nucleus = true, - core = consume_label('mathsmash', function(padded) - padded.height, padded.depth = 0, 0~ - end), - } { - {} - \finsm@sh - } -} -\IfPackageAtLeastTF{latex-lab-testphase-text}{2025-01-27} +\IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} {} { + \PackageInfo{luamml}{patching~\string\mathsm@sh} + \cs_set:Npn \mathsm@sh #1 #2 { + \setbox \z@ \hbox { + $ + \m@th #1 { + #2 + } + \luamml_save:nNn {mathsmash} #1 {mpadded} + \luamml_pdf_write: + $ + } + \luamml_annotate:nen {2} { + nucleus = true, + core = consume_label('mathsmash', function(padded) + padded.height, padded.depth = 0, 0~ + end), + } { + {} + \finsm@sh + } + } + \PackageInfo{luamml}{patching~\string\mathph@nt} \cs_set:Npn \mathph@nt #1 #2 { \setbox \z@ = \hbox { diff --git a/luamml.dtx b/luamml.dtx index 2494975..dfaa1c6 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -666,7 +666,37 @@ \AssignSocketPlug{tagsupport/math/luamml/finph@nt}{luamml} % % \end{macrocode} -% + +% \subsubsection{Math smash socket} +% This socket is used around \cs{finsm@sh}. +% It should provided until 2025-06-01 +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/finsm@sh_plug_str } + { + \NewSocket{tagsupport/math/luamml/finsm@sh}{2} + \NewSocketPlug{tagsupport/math/luamml/finsm@sh}{default}{#2} + \AssignSocketPlug{tagsupport/math/luamml/finsm@sh}{default} + } +% \end{macrocode} +% +% \begin{macrocode} +%<*luatex> +\NewSocketPlug{tagsupport/math/luamml/finsm@sh}{luamml} + { + \luamml_annotate:nen {2} + { + nucleus = true, + core = + consume_label('mathsmash', + function(padded) + padded.height, padded.depth = 0, 0~ + end), + } + { #2 } + } +\AssignSocketPlug{tagsupport/math/luamml/finsm@sh}{luamml} +% +% \end{macrocode} % \subsection{Patching} % For some packages, we ship with patches to make them more compatible and to % demonstrate how other code can be patched to work with \texttt{luamml}. From d3eb2bffdfa825122d4edf4cdaa9af7ffcaccb3c Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 28 Jan 2025 15:36:05 +0100 Subject: [PATCH 156/206] guard amstext patch --- luamml-patches-amstext.sty | 44 +++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/luamml-patches-amstext.sty b/luamml-patches-amstext.sty index a5ea9b7..3f16a86 100644 --- a/luamml-patches-amstext.sty +++ b/luamml-patches-amstext.sty @@ -1,25 +1,29 @@ \ProvidesExplPackage {luamml-patches-amstext} {2024-10-30} {0.2.0} - {Feel free to add a description here} + {patches of amstext commands} % This is the same definition as in latex-lab-amsmath. It can go with the % 2025-06-01 release. - -\sys_if_engine_luatex:T +\IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} + {} { - \def\text@#1{ - \tag_socket_use:nnn {math/luamml/hbox}{} - {{% - \ifcase\mathstyle - \hbox{{#1}}\or - \hbox{{#1}}\or - \hbox{{#1}}\or - \hbox{{#1}}\or - \hbox{{\let\f@size\sf@size\selectfont#1}}\or - \hbox{{\let\f@size\sf@size\selectfont#1}}\or - \hbox{{\let\f@size\ssf@size\selectfont#1}}\or - \hbox{{\let\f@size\ssf@size\selectfont#1}}\or - \ERROR - \fi - \check@mathfonts - }}} - } + \PackageInfo{luamml}{patching~\string\text@} + \sys_if_engine_luatex:T + { + \def\text@#1{ + \tag_socket_use:nnn {math/luamml/hbox}{} + {{% + \ifcase\mathstyle + \hbox{{#1}}\or + \hbox{{#1}}\or + \hbox{{#1}}\or + \hbox{{#1}}\or + \hbox{{\let\f@size\sf@size\selectfont#1}}\or + \hbox{{\let\f@size\sf@size\selectfont#1}}\or + \hbox{{\let\f@size\ssf@size\selectfont#1}}\or + \hbox{{\let\f@size\ssf@size\selectfont#1}}\or + \ERROR + \fi + \check@mathfonts + }}} + } + } From bb3d4736a611d89a4c581502384d3dc94bcb8ca6 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 28 Jan 2025 16:29:19 +0100 Subject: [PATCH 157/206] move array sockets into main file --- luamml-patches-array.sty | 45 --------------- luamml.dtx | 117 ++++++++++++++++++++++++++++++++------- 2 files changed, 98 insertions(+), 64 deletions(-) delete mode 100644 luamml-patches-array.sty diff --git a/luamml-patches-array.sty b/luamml-patches-array.sty deleted file mode 100644 index f169fd9..0000000 --- a/luamml-patches-array.sty +++ /dev/null @@ -1,45 +0,0 @@ -\ProvidesExplPackage {luamml-patches-array} {2024-10-30} {0.2.0} - {Feel free to add a description here} - -\lua_now:n { require'luamml-array' } - -\str_if_exist:cF { l__socket_tagsupport/math/luamml/array/save_plug_str } - { - \NewSocket{tagsupport/math/luamml/array/save}{0} - \NewSocket{tagsupport/math/luamml/array/finalize}{0} - \NewSocket{tagsupport/math/luamml/array/initcol}{0} - \NewSocket{tagsupport/math/luamml/array/savecol}{0} - \NewSocket{tagsupport/math/luamml/array/finalizecol}{1} - \AssignSocketPlug{tagsupport/math/luamml/array/finalizecol}{noop} - } - -\NewSocketPlug{tagsupport/math/luamml/array/save}{default} - { - \__luamml_array_save_array: - } - -\NewSocketPlug{tagsupport/math/luamml/array/finalize}{default} - { - \mode_if_math:T { \__luamml_array_finalize_array: } - } - -\NewSocketPlug{tagsupport/math/luamml/array/initcol}{default} - { - \__luamml_array_init_col: - } - -\NewSocketPlug{tagsupport/math/luamml/array/savecol}{default} - { - \luamml_save:nn {} {mtd} - } - -\NewSocketPlug{tagsupport/math/luamml/array/finalizecol}{default} - { - \__luamml_array_finalize_col:w #1~ - } - -\AssignSocketPlug{tagsupport/math/luamml/array/save}{default} -\AssignSocketPlug{tagsupport/math/luamml/array/finalize}{default} -\AssignSocketPlug{tagsupport/math/luamml/array/initcol}{default} -\AssignSocketPlug{tagsupport/math/luamml/array/savecol}{default} -\AssignSocketPlug{tagsupport/math/luamml/array/finalizecol}{default} diff --git a/luamml.dtx b/luamml.dtx index dfaa1c6..9ccb9c8 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -37,6 +37,9 @@ \usepackage{csquotes,luacolor} \MakeShortVerb{\|} \RecordChanges +\ProvideDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl} +\ProvideDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl} + \begin{document} \tracingmathml2 \DocInput{luamml.dtx} @@ -535,7 +538,7 @@ { \NewSocket{tagsupport/math/luamml/save}{1} \AssignSocketPlug{tagsupport/math/luamml/save}{noop} - } + } % \end{macrocode} % % \begin{macrocode} @@ -545,7 +548,84 @@ } \AssignSocketPlug{tagsupport/math/luamml/save}{luamml} % \end{macrocode} -% +% +% \subsection{socket plugs for the array package} +% +% The socket declaration can go with the 2025-06-01 release +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/array/save_plug_str } + { + \NewSocket{tagsupport/math/luamml/array/save}{0} + \NewSocket{tagsupport/math/luamml/array/finalize}{0} + \NewSocket{tagsupport/math/luamml/array/initcol}{0} + \NewSocket{tagsupport/math/luamml/array/savecol}{0} + \NewSocket{tagsupport/math/luamml/array/finalizecol}{1} + \AssignSocketPlug{tagsupport/math/luamml/array/finalizecol}{noop} + } +% \end{macrocode} +% +% The luamml support makes only sense with luatex. +% \begin{macrocode} +%<*luatex> +\AddToHook{package/array/after}{\lua_now:n { require'luamml-array' }} +% \end{macrocode} +% \begin{plugdecl}{tagsupport/math/luamml/array/save} +% The socket of this plug is used in \cs{endarray}. +% \begin{macrocode} +\NewSocketPlug{tagsupport/math/luamml/array/save}{luamml} + { + \__luamml_array_save_array: + } +% \end{macrocode} +% \end{plugdecl} +% +% \begin{plugdecl}{tagsupport/math/luamml/array/finalize} +% This socket of this plug is used in \cs{endarray}. +% \begin{macrocode} +\NewSocketPlug{tagsupport/math/luamml/array/finalize}{luamml} + { + \mode_if_math:T { \__luamml_array_finalize_array: } + } +% \end{macrocode} +% \end{plugdecl} +% +% \begin{plugdecl}{tagsupport/math/luamml/array/initcol} +% The socket of this plug is used in \cs{@classz}. +% \begin{macrocode} +\NewSocketPlug{tagsupport/math/luamml/array/initcol}{luamml} + { + \__luamml_array_init_col: + } +% \end{macrocode} +% \end{plugdecl} +% +% \begin{plugdecl}{tagsupport/math/luamml/array/savecol} +% The socket of this plug is used in \cs{@classz}. +% \begin{macrocode} +\NewSocketPlug{tagsupport/math/luamml/array/savecol}{luamml} + { + \luamml_save:nn {} {mtd} + } +% \end{macrocode} +% \end{plugdecl} +% +% \begin{plugdecl}{tagsupport/math/luamml/array/finalizecol} +% The socket of this plug is used used in \cs{@classz}. +% \begin{macrocode} +\NewSocketPlug{tagsupport/math/luamml/array/finalizecol}{luamml} + { + \__luamml_array_finalize_col:w #1~ + } +% \end{macrocode} +% \end{plugdecl} +% \begin{macrocode} +\AssignSocketPlug{tagsupport/math/luamml/array/save}{luamml} +\AssignSocketPlug{tagsupport/math/luamml/array/finalize}{luamml} +\AssignSocketPlug{tagsupport/math/luamml/array/initcol}{luamml} +\AssignSocketPlug{tagsupport/math/luamml/array/savecol}{luamml} +\AssignSocketPlug{tagsupport/math/luamml/array/finalizecol}{luamml} +% +% \end{macrocode} % \subsubsection{amsmath alignments} % % This socket finalize the \texttt{mtable} in alignments like align or gather. @@ -619,19 +699,19 @@ \NewSocket{tagsupport/math/luamml/artifact}{0} } %<*luatex> -\NewSocketPlug{tagsupport/math/luamml/artifact}{default} +\NewSocketPlug{tagsupport/math/luamml/artifact}{luamml} { \int_if_odd:nT { \int_div_truncate:nn { \l__luamml_flag_int } { 8 } } { \tag_mc_begin:n{artifact} } } -\AssignSocketPlug{tagsupport/math/luamml/artifact}{default} +\AssignSocketPlug{tagsupport/math/luamml/artifact}{luamml} % % \end{macrocode} % % \subsubsection{Math phantom socket} -% This socket is used around \cs{finph@nt}. +% This socket is used around \cs{finph@nt}. % It should provided until 2025-06-01 % \begin{macrocode} \str_if_exist:cF { l__socket_tagsupport/math/luamml/finph@nt_plug_str } @@ -639,17 +719,17 @@ \NewSocket{tagsupport/math/luamml/finph@nt}{2} \NewSocketPlug{tagsupport/math/luamml/finph@nt}{default}{#2} \AssignSocketPlug{tagsupport/math/luamml/finph@nt}{default} - } + } % \end{macrocode} % % \begin{macrocode} %<*luatex> \NewSocketPlug{tagsupport/math/luamml/finph@nt}{luamml} { - \luamml_annotate:nen {1} + \luamml_annotate:nen {1} { nucleus = true, - core = + core = { [0] = 'mpadded', \ifh@\else @@ -661,14 +741,14 @@ consume_label'mathphant', } } - { #2 } + { #2 } } \AssignSocketPlug{tagsupport/math/luamml/finph@nt}{luamml} % -% \end{macrocode} +% \end{macrocode} % \subsubsection{Math smash socket} -% This socket is used around \cs{finsm@sh}. +% This socket is used around \cs{finsm@sh}. % It should provided until 2025-06-01 % \begin{macrocode} \str_if_exist:cF { l__socket_tagsupport/math/luamml/finsm@sh_plug_str } @@ -676,27 +756,27 @@ \NewSocket{tagsupport/math/luamml/finsm@sh}{2} \NewSocketPlug{tagsupport/math/luamml/finsm@sh}{default}{#2} \AssignSocketPlug{tagsupport/math/luamml/finsm@sh}{default} - } + } % \end{macrocode} % % \begin{macrocode} %<*luatex> \NewSocketPlug{tagsupport/math/luamml/finsm@sh}{luamml} { - \luamml_annotate:nen {2} + \luamml_annotate:nen {2} { nucleus = true, - core = - consume_label('mathsmash', + core = + consume_label('mathsmash', function(padded) padded.height, padded.depth = 0, 0~ end), } - { #2 } + { #2 } } \AssignSocketPlug{tagsupport/math/luamml/finsm@sh}{luamml} % -% \end{macrocode} +% \end{macrocode} % \subsection{Patching} % For some packages, we ship with patches to make them more compatible and to % demonstrate how other code can be patched to work with \texttt{luamml}. @@ -722,7 +802,7 @@ % \end{macrocode} % \end{macro} % -% We currently provide minimal patching for the kernel, \pkg{amsmath} and \pkg{array}. +% We currently provide minimal patching for the kernel, \pkg{amsmath}. % Currently only the kernel code supports pdf\TeX, but it's planned to extend this. % \begin{macrocode} \RequirePackage { luamml-patches-kernel } @@ -730,7 +810,6 @@ \__luamml_patch_package:n {amstext} \__luamml_patch_package:n {amsmath} \__luamml_patch_package:n {mathtools} -\__luamml_patch_package:n {array} % % \end{macrocode} From fb80000eb8f47b4a5ed9e8c80cfbe12603fde3d5 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Wed, 29 Jan 2025 12:41:42 +0100 Subject: [PATCH 158/206] use generic socket for saving --- luamml.dtx | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/luamml.dtx b/luamml.dtx index 9ccb9c8..a8161aa 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -530,35 +530,40 @@ % In various places luamml has to add code to kernel commands. This is done through % sockets which are predeclared in lttagging. % -% \subsubsection{Save socket} -% This socket is a wrapper around the \cs{luamml_save:nNn} command -% It should provided until 2025-06-01 +% \subsubsection{Save sockets} +% These sockets are wrappers around the \cs{luamml_save:...} commands +% They should be provided until 2025-06-01 % \begin{macrocode} -\str_if_exist:cF { l__socket_tagsupport/math/luamml/save_plug_str } +\str_if_exist:cF { l__socket_tagsupport/math/luamml/save/nn_plug_str } { - \NewSocket{tagsupport/math/luamml/save}{1} - \AssignSocketPlug{tagsupport/math/luamml/save}{noop} + \NewSocket{tagsupport/math/luamml/save/nn}{1} + \AssignSocketPlug{tagsupport/math/luamml/save/nn}{noop} + \NewSocket{tagsupport/math/luamml/save/nNn}{1} + \AssignSocketPlug{tagsupport/math/luamml/save/nNn}{noop} } % \end{macrocode} % % \begin{macrocode} -\NewSocketPlug{tagsupport/math/luamml/save}{luamml} +\NewSocketPlug{tagsupport/math/luamml/save/nNn}{luamml} { \luamml_save:nNn #1 } -\AssignSocketPlug{tagsupport/math/luamml/save}{luamml} +\NewSocketPlug{tagsupport/math/luamml/save/nn}{luamml} + { + \luamml_save:nn #1 + } +\AssignSocketPlug{tagsupport/math/luamml/save/nn}{luamml} % \end{macrocode} % % \subsection{socket plugs for the array package} % % The socket declaration can go with the 2025-06-01 release % \begin{macrocode} -\str_if_exist:cF { l__socket_tagsupport/math/luamml/array/save_plug_str } +\str_if_exist:cF { l__socket_tagsupport/math/luamml/array/finalize_plug_str } { \NewSocket{tagsupport/math/luamml/array/save}{0} \NewSocket{tagsupport/math/luamml/array/finalize}{0} \NewSocket{tagsupport/math/luamml/array/initcol}{0} - \NewSocket{tagsupport/math/luamml/array/savecol}{0} \NewSocket{tagsupport/math/luamml/array/finalizecol}{1} \AssignSocketPlug{tagsupport/math/luamml/array/finalizecol}{noop} } @@ -599,15 +604,6 @@ % \end{macrocode} % \end{plugdecl} % -% \begin{plugdecl}{tagsupport/math/luamml/array/savecol} -% The socket of this plug is used in \cs{@classz}. -% \begin{macrocode} -\NewSocketPlug{tagsupport/math/luamml/array/savecol}{luamml} - { - \luamml_save:nn {} {mtd} - } -% \end{macrocode} -% \end{plugdecl} % % \begin{plugdecl}{tagsupport/math/luamml/array/finalizecol} % The socket of this plug is used used in \cs{@classz}. From b970df3c9e8bc89e653b6f2c654f8aae9b12d1f5 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Wed, 29 Jan 2025 14:35:26 +0100 Subject: [PATCH 159/206] assign socket --- luamml.dtx | 1 + 1 file changed, 1 insertion(+) diff --git a/luamml.dtx b/luamml.dtx index a8161aa..1b75b60 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -548,6 +548,7 @@ { \luamml_save:nNn #1 } +\AssignSocketPlug{tagsupport/math/luamml/save/nNn}{luamml} \NewSocketPlug{tagsupport/math/luamml/save/nn}{luamml} { \luamml_save:nn #1 From 06986af907c1d96f4abf54d66c1337227aae9e50 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Wed, 29 Jan 2025 19:49:16 +0100 Subject: [PATCH 160/206] remove stray assigment --- luamml.dtx | 1 - 1 file changed, 1 deletion(-) diff --git a/luamml.dtx b/luamml.dtx index 1b75b60..e5de0f5 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -619,7 +619,6 @@ \AssignSocketPlug{tagsupport/math/luamml/array/save}{luamml} \AssignSocketPlug{tagsupport/math/luamml/array/finalize}{luamml} \AssignSocketPlug{tagsupport/math/luamml/array/initcol}{luamml} -\AssignSocketPlug{tagsupport/math/luamml/array/savecol}{luamml} \AssignSocketPlug{tagsupport/math/luamml/array/finalizecol}{luamml} % % \end{macrocode} From a727a3a30983deb2e5ba8b5dce06e786c170dbe5 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 31 Jan 2025 01:01:39 +0100 Subject: [PATCH 161/206] more sockets --- luamml-patches-amsmath.sty | 39 ++++++++++------------------------- luamml.dtx | 42 +++++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 29 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index b9556d1..04c97f5 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -15,11 +15,7 @@ \nonmatherr@ { \begin { \@currenvir } } \fi \savecolumn@ % Assumption: called inside a group - \luamml_annotate:en { - core = false - } { - \alignedspace@left - } + \UseTaggingSocket{ math/luamml/annotate/false } {}{ \alignedspace@left } \ams@start@box {#1} \bgroup \maxfields@ #2 \relax \ifnum \maxfields@ > \m@ne @@ -44,7 +40,7 @@ {##} \luamml_save:nNn {} \displaystyle {mtd} $ - \__luamml_amsmath_add_last_to_row: + \UseTaggingSocket{math/luamml/mtable/finalizecol} \tabskip \z@skip & \column@plus $ @@ -56,7 +52,7 @@ } \luamml_save:nNn {} \displaystyle {mtd} $ - \__luamml_amsmath_add_last_to_row: + \UseTaggingSocket{math/luamml/mtable/finalizecol} \hfil \tabskip\alignsep@ \crcr @@ -68,11 +64,7 @@ \else \nonmatherr@ { \begin {gathered} } \fi - \luamml_annotate:en { - core = false - } { - \alignedspace@left - } + \UseTaggingSocket{ math/luamml/annotate/false } {}{ \alignedspace@left } \ams@start@box {#1} \bgroup \Let@ \chardef \dspbrk@context \@ne @@ -87,7 +79,7 @@ ## \luamml_save:nNn {} \displaystyle {mtd} $ - \__luamml_amsmath_add_last_to_row: + \UseTaggingSocket{math/luamml/mtable/finalizecol} \hfil \crcr \ams@return@opt@arg @@ -302,14 +294,14 @@ \cs_set:Npn \endmultline@math { \luamml_save:nNn {} \displaystyle {mtd} $ - \__luamml_amsmath_add_last_to_row: + \UseTaggingSocket{math/luamml/mtable/finalizecol} } \cs_set:Npn \rendmultline@ { \iftag@ \luamml_save:nNn {} \displaystyle {mtd} $ - \__luamml_amsmath_add_last_to_row: + \UseTaggingSocket{math/luamml/mtable/finalizecol} \let \endmultline@math \relax \ifshifttag@ \hskip \multlinegap @@ -354,12 +346,7 @@ % Finally some slightly different stuff. % While {matrix} is covered by {array}, we still have {smallmatrix}: \renewenvironment {smallmatrix} { - \luamml_annotate:en { - core = false - } { - \null - \, - } + \UseTaggingSocket{ math/luamml/annotate/false } {} { \null\, } \vcenter \bgroup \Let@ \restore@math@cr @@ -375,7 +362,7 @@ ## \luamml_save:nn {} {mtd} % No \scriptsize here since we want to add the mstyle nodes $ - \__luamml_amsmath_add_last_to_row: + \UseTaggingSocket{math/luamml/mtable/finalizecol} \hfil && \thickspace @@ -386,7 +373,7 @@ ## \luamml_save:nn {} {mtd} % No \scriptsize here since we want to add the mstyle nodes $ - \__luamml_amsmath_add_last_to_row: + \UseTaggingSocket{math/luamml/mtable/finalizecol} \hfil \crcr }{% @@ -395,11 +382,7 @@ \egroup \egroup \__luamml_amsmath_finalize_inner_table: - \luamml_annotate:en { - core = false - } { - \, - } + \UseTaggingSocket{ math/luamml/annotate/false } {}{ \, } } % {cases} is defined by the kernel, but we patch the overwritten version by amsmath. diff --git a/luamml.dtx b/luamml.dtx index e5de0f5..5dde284 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -556,7 +556,27 @@ \AssignSocketPlug{tagsupport/math/luamml/save/nn}{luamml} % \end{macrocode} % -% \subsection{socket plugs for the array package} +% \subsubsection{sockets to annotate content} +% +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/annotate/false_plug_str } + { + \NewSocket{tagsupport/math/luamml/annotate/false}{2} + \NewSocketPlug{tagsupport/math/luamml/annotate/false}{default}{#2} + \AssignSocketPlug{tagsupport/math/luamml/annotate/false}{default} + } +%<*luatex> +\NewSocketPlug{tagsupport/math/luamml/annotate/false}{luamml} + { + \luamml_annotate:en { core = false } + { + #2 + } + } +\AssignSocketPlug{tagsupport/math/luamml/annotate/false}{luamml} +% +% \end{macrocode} +% \subsubsection{socket plugs for the array package} % % The socket declaration can go with the 2025-06-01 release % \begin{macrocode} @@ -624,6 +644,26 @@ % \end{macrocode} % \subsubsection{amsmath alignments} % +% This socket is used at the end of alignment cells and adds the content to +% the current row. +% +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/mtable/finalizecol_plug_str } + { + \NewSocket{tagsupport/math/luamml/mtable/finalizecol}{0} + } +% \end{macrocode} +% \begin{macrocode} +%<*luatex> +\NewSocketPlug{tagsupport/math/luamml/mtable/finalizecol}{luamml} + { + \__luamml_amsmath_add_last_to_row: + } +\AssignSocketPlug{tagsupport/math/luamml/mtable/finalizecol}{luamml} + +% +% \end{macrocode} +% % This socket finalize the \texttt{mtable} in alignments like align or gather. % It takes an argument, the environment. % It should be used normally with \cs{UseExpandableTaggingSocket}. From c5ee5114fb3c778ee5c02065e5da171690b0813f Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 31 Jan 2025 16:50:49 +0100 Subject: [PATCH 162/206] exchange commands by sockets --- luamml-patches-amsmath.sty | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 04c97f5..9a8ccee 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -38,7 +38,7 @@ \m@th \displaystyle {##} - \luamml_save:nNn {} \displaystyle {mtd} + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} $ \UseTaggingSocket{math/luamml/mtable/finalizecol} \tabskip \z@skip @@ -50,7 +50,7 @@ {} ## } - \luamml_save:nNn {} \displaystyle {mtd} + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} $ \UseTaggingSocket{math/luamml/mtable/finalizecol} \hfil @@ -77,7 +77,7 @@ \m@th \displaystyle ## - \luamml_save:nNn {} \displaystyle {mtd} + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} $ \UseTaggingSocket{math/luamml/mtable/finalizecol} \hfil @@ -114,7 +114,7 @@ \m@th \displaystyle {##} - \luamml_save:nNn {} \displaystyle {mtd} + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} $ } \__luamml_amsmath_add_box_to_row: @@ -174,7 +174,7 @@ \ifmeasuring@ \luamml_ignore: \else - \luamml_save:nNn {} \displaystyle {mtd} + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} \fi $ } @@ -198,7 +198,7 @@ \ifmeasuring@ \luamml_ignore: \else - \luamml_save:nNn {} \displaystyle {mtd} + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} \fi $ } @@ -360,7 +360,8 @@ \m@th \scriptstyle ## - \luamml_save:nn {} {mtd} % No \scriptsize here since we want to add the mstyle nodes + % No \scriptsize here since we want to add the mstyle nodes + \UseTaggingSocket{math/luamml/save/nn}{ {} {mtd}} $ \UseTaggingSocket{math/luamml/mtable/finalizecol} \hfil @@ -371,7 +372,8 @@ \m@th \scriptstyle ## - \luamml_save:nn {} {mtd} % No \scriptsize here since we want to add the mstyle nodes + % No \scriptsize here since we want to add the mstyle nodes + \UseTaggingSocket{math/luamml/save/nn}{ {} {mtd}} $ \UseTaggingSocket{math/luamml/mtable/finalizecol} \hfil From e1741b13d58aee0c386a19017e6d84663db800e5 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 31 Jan 2025 19:48:05 +0100 Subject: [PATCH 163/206] more sockets, start to move amsmath env --- luamml-patches-amsmath.sty | 70 ++++++++++++++++++++++---------------- luamml.dtx | 28 +++++++++++++-- 2 files changed, 65 insertions(+), 33 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 9a8ccee..5adedcd 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -40,7 +40,7 @@ {##} \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} $ - \UseTaggingSocket{math/luamml/mtable/finalizecol} + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} \tabskip \z@skip & \column@plus $ @@ -52,7 +52,7 @@ } \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} $ - \UseTaggingSocket{math/luamml/mtable/finalizecol} + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} \hfil \tabskip\alignsep@ \crcr @@ -79,7 +79,7 @@ ## \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} $ - \UseTaggingSocket{math/luamml/mtable/finalizecol} + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} \hfil \crcr \ams@return@opt@arg @@ -117,7 +117,7 @@ \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} $ } - \__luamml_amsmath_add_box_to_row: + \UseTaggingSocket{math/luamml/mtable/finalizecol}{box} \calc@shift@gather \set@gather@field \tabskip\@centering @@ -132,7 +132,7 @@ { \place@tag@gather } { \place@tag@gather - \__luamml_amsmath_set_tag: + \UseTaggingSocket{math/luamml/mtable/tag/set} } \tabskip \iftagsleft@ \gdisplaywidth@ @@ -150,15 +150,18 @@ { \luamml_ignore: } { \__luamml_amsmath_original_gmeasure:n {#1} } } - -\cs_set:Npn \endgather { - \math@cr - \black@ \totwidth@ - \UseExpandableTaggingSocket{math/luamml/mtable/finalize} {gather} - \egroup - $$ - \ignorespacesafterend -} +\IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} + {} + { \PackageInfo{luamml}{patching~\string\endgather} + \cs_set:Npn \endgather { + \math@cr + \black@ \totwidth@ + \UseExpandableTaggingSocket{math/luamml/mtable/finalize} {gather} + \egroup + $$ + \ignorespacesafterend + } + } % align and friends \cs_set:Npn \align@preamble { @@ -181,7 +184,7 @@ \ifmeasuring@ \savefieldlength@ \else - \__luamml_amsmath_add_box_to_row: + \UseTaggingSocket{math/luamml/mtable/finalizecol}{box} \fi \set@field \tabskip\z@skip @@ -205,7 +208,7 @@ \ifmeasuring@ \savefieldlength@ \else - \__luamml_amsmath_add_box_to_row: + \UseTaggingSocket{math/luamml/mtable/finalizecol}{box} \fi \set@field \hfil @@ -230,7 +233,7 @@ { \make@display@tag } } \place@tag - \__luamml_amsmath_set_tag: + \UseTaggingSocket{math/luamml/mtable/tag/set} \fi \ifst@rred \else @@ -240,14 +243,21 @@ \cr } -\cs_set:Npn \maketag@@@ #1 { - \hbox { - \m@th - \normalfont - #1 - \__luamml_amsmath_save_tag: - } -} +% This was lost anyway, as the latex-lab code overwrites +% the definition again. +\IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} + {} + { \PackageInfo{luamml}{patching~\string\maketag@@@} + \cs_set:Npn \maketag@@@ #1 + { + \hbox { + \m@th + \normalfont + #1 + \UseTaggingSocket{math/luamml/mtable/tag/save} + } + } + } \cs_set:Npn \endalign { \math@cr @@ -294,14 +304,14 @@ \cs_set:Npn \endmultline@math { \luamml_save:nNn {} \displaystyle {mtd} $ - \UseTaggingSocket{math/luamml/mtable/finalizecol} + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} } \cs_set:Npn \rendmultline@ { \iftag@ \luamml_save:nNn {} \displaystyle {mtd} $ - \UseTaggingSocket{math/luamml/mtable/finalizecol} + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} \let \endmultline@math \relax \ifshifttag@ \hskip \multlinegap @@ -322,7 +332,7 @@ \hskip \multlinetaggap \make@display@tag \fi - \__luamml_amsmath_set_tag: + \UseTaggingSocket{math/luamml/mtable/tag/set} \else \hskip \multlinegap \fi @@ -363,7 +373,7 @@ % No \scriptsize here since we want to add the mstyle nodes \UseTaggingSocket{math/luamml/save/nn}{ {} {mtd}} $ - \UseTaggingSocket{math/luamml/mtable/finalizecol} + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} \hfil && \thickspace @@ -375,7 +385,7 @@ % No \scriptsize here since we want to add the mstyle nodes \UseTaggingSocket{math/luamml/save/nn}{ {} {mtd}} $ - \UseTaggingSocket{math/luamml/mtable/finalizecol} + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} \hfil \crcr }{% diff --git a/luamml.dtx b/luamml.dtx index 5dde284..b0ae894 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -650,14 +650,14 @@ % \begin{macrocode} \str_if_exist:cF { l__socket_tagsupport/math/luamml/mtable/finalizecol_plug_str } { - \NewSocket{tagsupport/math/luamml/mtable/finalizecol}{0} + \NewSocket{tagsupport/math/luamml/mtable/finalizecol}{1} } % \end{macrocode} % \begin{macrocode} %<*luatex> \NewSocketPlug{tagsupport/math/luamml/mtable/finalizecol}{luamml} { - \__luamml_amsmath_add_last_to_row: + \use:c{__luamml_amsmath_add_#1_to_row:} } \AssignSocketPlug{tagsupport/math/luamml/mtable/finalizecol}{luamml} @@ -685,7 +685,29 @@ % % \end{macrocode} % -% +% These sockets save and set tags and labels in alignments. +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/mtable/tag/save_plug_str } + { + \NewSocket{tagsupport/math/luamml/mtable/tag/save}{0} + \NewSocket{tagsupport/math/luamml/mtable/tag/set}{0} + } +% \end{macrocode} +% \begin{macrocode} +%<*luatex> +\NewSocketPlug{tagsupport/math/luamml/mtable/tag/save}{luamml} + { + \__luamml_amsmath_save_tag: + } +\AssignSocketPlug{tagsupport/math/luamml/mtable/tag/save}{luamml} +\NewSocketPlug{tagsupport/math/luamml/mtable/tag/set}{luamml} + { + \__luamml_amsmath_set_tag: + } +\AssignSocketPlug{tagsupport/math/luamml/mtable/tag/set}{luamml} + +% +% \end{macrocode} % \subsubsection{Horizontal boxes} % This socket annotates an \cs{hbox} inside box commands used in math. % We test for the socket until the release 2025-06-01. From bdd3cd74800ac0b070150230557bea86fbaf7ad1 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sat, 1 Feb 2025 01:15:22 +0100 Subject: [PATCH 164/206] moving gathered --- luamml-patches-amsmath.sty | 88 ++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 5adedcd..e4e5a6d 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -58,32 +58,36 @@ \crcr \ams@return@opt@arg } - -\renewcommand \gathered [1] [c] { - \RIfM@ - \else - \nonmatherr@ { \begin {gathered} } - \fi - \UseTaggingSocket{ math/luamml/annotate/false } {}{ \alignedspace@left } - \ams@start@box {#1} \bgroup - \Let@ - \chardef \dspbrk@context \@ne - \restore@math@cr - \spread@equation - \ialign \bgroup - \hfil - \strut@ - $ - \m@th - \displaystyle - ## - \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} - $ - \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} - \hfil - \crcr - \ams@return@opt@arg -} +\IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} + {} + { + \PackageInfo{luamml}{patching~gathered} + \renewcommand \gathered [1] [c] { + \RIfM@ + \else + \nonmatherr@ { \begin {gathered} } + \fi + \UseTaggingSocket{ math/luamml/annotate/false } {}{ \alignedspace@left } + \ams@start@box {#1} \bgroup + \Let@ + \chardef \dspbrk@context \@ne + \restore@math@cr + \spread@equation + \ialign \bgroup + \hfil + \strut@ + $ + \m@th + \displaystyle + ## + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} + $ + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} + \hfil + \crcr + \ams@return@opt@arg + } + } \cs_set:Npn \endaligned { \crcr @@ -257,22 +261,22 @@ \UseTaggingSocket{math/luamml/mtable/tag/save} } } - } - -\cs_set:Npn \endalign { - \math@cr - \black@ \totwidth@ - \UseTaggingSocket{math/luamml/mtable/finalize} {align} - \egroup - \ifingather@ - \restorealignstate@ - \egroup - \nonumber - \ifnum0=`{\fi\iffalse}\fi - \else - $$ - \fi - \ignorespacesafterend +% this handled in latex-lab through \common@align@ending + \cs_set:Npn \endalign { + \math@cr + \black@ \totwidth@ + \UseTaggingSocket{math/luamml/mtable/finalize} {align} + \egroup + \ifingather@ + \restorealignstate@ + \egroup + \nonumber + \ifnum0=`{\fi\iffalse}\fi + \else + $$ + \fi + \ignorespacesafterend + } } % For a more interesting one, let's consider multline: From ece360295acd59aa6bf218ad3a4224d50d16fad9 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sat, 1 Feb 2025 23:57:08 +0100 Subject: [PATCH 165/206] inner table sockets --- luamml-patches-amsmath.sty | 8 ++++---- luamml.dtx | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index e4e5a6d..ea4c8a4 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -91,11 +91,11 @@ \cs_set:Npn \endaligned { \crcr - \__luamml_amsmath_save_inner_table:n \@currenvir + \UseExpandableTaggingSocket{math/luamml/mtable/innertable/save} \egroup \restorecolumn@ \egroup - \__luamml_amsmath_finalize_inner_table: + \UseTaggingSocket{math/luamml/mtable/innertable/finalize} } % gather @@ -394,10 +394,10 @@ \crcr }{% \crcr - \__luamml_amsmath_save_smallmatrix: + \UseExpandableTaggingSocket{math/luamml/mtable/smallmatrix/save} \egroup \egroup - \__luamml_amsmath_finalize_inner_table: + \UseTaggingSocket{math/luamml/mtable/innertable/finalize} \UseTaggingSocket{ math/luamml/annotate/false } {}{ \, } } diff --git a/luamml.dtx b/luamml.dtx index b0ae894..71f17d1 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -663,6 +663,36 @@ % % \end{macrocode} +% +% These sockets save an inner table +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/mtable/innertable/save_plug_str } + { + \NewSocket{tagsupport/math/luamml/mtable/innertable/save}{0} + \NewSocket{tagsupport/math/luamml/mtable/smallmatrix/save}{0} + \NewSocket{tagsupport/math/luamml/mtable/innertable/finalize}{0} + } +% \end{macrocode} +% \begin{macrocode} +%<*luatex> +\NewSocketPlug{tagsupport/math/luamml/mtable/innertable/save}{luamml} + { + \__luamml_amsmath_save_inner_table:n \@currenvir + } +\AssignSocketPlug{tagsupport/math/luamml/mtable/innertable/save}{luamml} +\NewSocketPlug{tagsupport/math/luamml/mtable/smallmatrix/save}{luamml} + { + \__luamml_amsmath_save_smallmatrix: + } +\AssignSocketPlug{tagsupport/math/luamml/mtable/smallmatrix/save}{luamml} +\NewSocketPlug{tagsupport/math/luamml/mtable/innertable/finalize}{luamml} + { + \__luamml_amsmath_finalize_inner_table: + } +\AssignSocketPlug{tagsupport/math/luamml/mtable/innertable/finalize}{luamml} +% +% \end{macrocode} + % % This socket finalize the \texttt{mtable} in alignments like align or gather. % It takes an argument, the environment. From cfeb4083325145b513afb15342d5c460ffd83083 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sun, 2 Feb 2025 00:49:24 +0100 Subject: [PATCH 166/206] move aligned commands to latex-lab --- luamml-patches-amsmath.sty | 122 ++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index ea4c8a4..8443d64 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -7,60 +7,60 @@ % But they are almost identical to the original and only % add luamml commands in appropriate places, so they would % mostly disappear if there were enough hooks in amsmath. - -% aligned and friends -\cs_set:Npn \start@aligned #1#2 { - \RIfM@ - \else - \nonmatherr@ { \begin { \@currenvir } } - \fi - \savecolumn@ % Assumption: called inside a group - \UseTaggingSocket{ math/luamml/annotate/false } {}{ \alignedspace@left } - \ams@start@box {#1} \bgroup - \maxfields@ #2 \relax - \ifnum \maxfields@ > \m@ne - \multiply \maxfields@ \tw@ - \let \math@cr@@@ \math@cr@@@alignedat - \alignsep@ \z@skip - \else - \let \math@cr@@@ \math@cr@@@aligned - \alignsep@ \minalignsep - \fi - \Let@ \chardef \dspbrk@context \@ne - \default@tag - \spread@equation % no-op if already called - \global \column@ \z@ - \ialign \bgroup - & \column@plus - \hfil - \strut@ - $ - \m@th - \displaystyle - {##} - \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} - $ - \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} - \tabskip \z@skip - & \column@plus - $ - \m@th - \displaystyle - { - {} - ## - } - \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} - $ - \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} - \hfil - \tabskip\alignsep@ - \crcr - \ams@return@opt@arg -} \IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} {} { + \PackageInfo{luamml}{patching~\string\start@aligned} + % aligned and friends + \cs_set:Npn \start@aligned #1#2 { + \RIfM@ + \else + \nonmatherr@ { \begin { \@currenvir } } + \fi + \savecolumn@ % Assumption: called inside a group + \UseTaggingSocket{ math/luamml/annotate/false } {}{ \alignedspace@left } + \ams@start@box {#1} \bgroup + \maxfields@ #2 \relax + \ifnum \maxfields@ > \m@ne + \multiply \maxfields@ \tw@ + \let \math@cr@@@ \math@cr@@@alignedat + \alignsep@ \z@skip + \else + \let \math@cr@@@ \math@cr@@@aligned + \alignsep@ \minalignsep + \fi + \Let@ \chardef \dspbrk@context \@ne + \default@tag + \spread@equation % no-op if already called + \global \column@ \z@ + \ialign \bgroup + & \column@plus + \hfil + \strut@ + $ + \m@th + \displaystyle + {##} + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} + $ + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} + \tabskip \z@skip + & \column@plus + $ + \m@th + \displaystyle + { + {} + ## + } + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} + $ + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} + \hfil + \tabskip\alignsep@ + \crcr + \ams@return@opt@arg + } \PackageInfo{luamml}{patching~gathered} \renewcommand \gathered [1] [c] { \RIfM@ @@ -87,16 +87,16 @@ \crcr \ams@return@opt@arg } - } - -\cs_set:Npn \endaligned { - \crcr - \UseExpandableTaggingSocket{math/luamml/mtable/innertable/save} - \egroup - \restorecolumn@ - \egroup - \UseTaggingSocket{math/luamml/mtable/innertable/finalize} -} + \PackageInfo{luamml}{patching~\string\endaligned} + \cs_set:Npn \endaligned { + \crcr + \UseExpandableTaggingSocket{math/luamml/mtable/innertable/save} + \egroup + \restorecolumn@ + \egroup + \UseTaggingSocket{math/luamml/mtable/innertable/finalize} + } + } % gather \cs_set:Npn \gather@ #1 { From 3d4d7ecd22cd774d6cabf05158746eae60d6d0eb Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sun, 2 Feb 2025 01:27:50 +0100 Subject: [PATCH 167/206] move smallmatrix patch --- luamml-patches-amsmath.sty | 88 ++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 41 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 8443d64..1bb3d91 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -359,47 +359,53 @@ % Finally some slightly different stuff. % While {matrix} is covered by {array}, we still have {smallmatrix}: -\renewenvironment {smallmatrix} { - \UseTaggingSocket{ math/luamml/annotate/false } {} { \null\, } - \vcenter \bgroup - \Let@ - \restore@math@cr - \default@tag - \baselineskip 6 \ex@ - \lineskip 1.5 \ex@ - \lineskiplimit \lineskip - \ialign \bgroup - \hfil - $ - \m@th - \scriptstyle - ## - % No \scriptsize here since we want to add the mstyle nodes - \UseTaggingSocket{math/luamml/save/nn}{ {} {mtd}} - $ - \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} - \hfil - && - \thickspace - \hfil - $ - \m@th - \scriptstyle - ## - % No \scriptsize here since we want to add the mstyle nodes - \UseTaggingSocket{math/luamml/save/nn}{ {} {mtd}} - $ - \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} - \hfil - \crcr -}{% - \crcr - \UseExpandableTaggingSocket{math/luamml/mtable/smallmatrix/save} - \egroup - \egroup - \UseTaggingSocket{math/luamml/mtable/innertable/finalize} - \UseTaggingSocket{ math/luamml/annotate/false } {}{ \, } -} + +\IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} + {} + { \PackageInfo{luamml}{patching~smallmatrix} + + \renewenvironment {smallmatrix} { + \UseTaggingSocket{ math/luamml/annotate/false } {} { \null\, } + \vcenter \bgroup + \Let@ + \restore@math@cr + \default@tag + \baselineskip 6 \ex@ + \lineskip 1.5 \ex@ + \lineskiplimit \lineskip + \ialign \bgroup + \hfil + $ + \m@th + \scriptstyle + ## + % No \scriptsize here since we want to add the mstyle nodes + \UseTaggingSocket{math/luamml/save/nn}{ {} {mtd}} + $ + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} + \hfil + && + \thickspace + \hfil + $ + \m@th + \scriptstyle + ## + % No \scriptsize here since we want to add the mstyle nodes + \UseTaggingSocket{math/luamml/save/nn}{ {} {mtd}} + $ + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} + \hfil + \crcr + }{% + \crcr + \UseExpandableTaggingSocket{math/luamml/mtable/smallmatrix/save} + \egroup + \egroup + \UseTaggingSocket{math/luamml/mtable/innertable/finalize} + \UseTaggingSocket{ math/luamml/annotate/false } {}{ \, } + } + } % {cases} is defined by the kernel, but we patch the overwritten version by amsmath. \cs_set:Npn \env@cases { From 5c8cf1b013bffa2e68a98bc3d0a65c8595cb5fb8 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sun, 2 Feb 2025 20:41:23 +0100 Subject: [PATCH 168/206] move gather commands to latex-lab --- luamml-patches-amsmath.sty | 131 ++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 66 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 1bb3d91..bc23b5d 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -9,7 +9,7 @@ % mostly disappear if there were enough hooks in amsmath. \IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} {} - { + { \PackageInfo{luamml}{patching~\string\start@aligned} % aligned and friends \cs_set:Npn \start@aligned #1#2 { @@ -61,7 +61,7 @@ \crcr \ams@return@opt@arg } - \PackageInfo{luamml}{patching~gathered} + \PackageInfo{luamml}{patching~gathered} \renewcommand \gathered [1] [c] { \RIfM@ \else @@ -87,7 +87,7 @@ \crcr \ams@return@opt@arg } - \PackageInfo{luamml}{patching~\string\endaligned} + \PackageInfo{luamml}{patching~\string\endaligned} \cs_set:Npn \endaligned { \crcr \UseExpandableTaggingSocket{math/luamml/mtable/innertable/save} @@ -96,67 +96,66 @@ \egroup \UseTaggingSocket{math/luamml/mtable/innertable/finalize} } - } + \PackageInfo{luamml}{patching~\string\gather@} + \cs_set:Npn \gather@ #1 { + \ingather@true + \let \split \insplit@ + \let \tag \tag@in@align + \let \label \label@in@display + \chardef \dspbrk@context \z@ + \intertext@ \displ@y@ \Let@ + \let \math@cr@@@ \math@cr@@@gather + \gmeasure@ {#1} + \global \shifttag@false + \tabskip \z@skip + \global \row@ \@ne + \halign to \displaywidth \bgroup + \strut@ + \setboxz@h { + $ + \m@th + \displaystyle + {##} + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} + $ + } + \UseTaggingSocket{math/luamml/mtable/finalizecol}{box} + \calc@shift@gather + \set@gather@field + \tabskip\@centering + & + \setboxz@h { + \strut@ + {##} + } + \dim_compare:nNnTF {0pt} = { + \box_wd:N \c_zero_int + } + { \place@tag@gather } + { + \place@tag@gather + \UseTaggingSocket{math/luamml/mtable/tag/set} + } + \tabskip \iftagsleft@ + \gdisplaywidth@ + \else + \z@skip + \span \fi + \crcr + #1 + } +% in latex lab, add the luamml_ignore to \measuring@true instead. + \PackageInfo{luamml}{patching~\string\gmeasure@} + \cs_new_eq:NN \__luamml_amsmath_original_gmeasure:n \gmeasure@ + \cs_set:Npn \gmeasure@ #1 { + \exp_last_unbraced:Nno + \use_ii_i:nn + { \luamml_ignore: } + { \__luamml_amsmath_original_gmeasure:n {#1} } + } -% gather -\cs_set:Npn \gather@ #1 { - \ingather@true - \let \split \insplit@ - \let \tag \tag@in@align - \let \label \label@in@display - \chardef \dspbrk@context \z@ - \intertext@ \displ@y@ \Let@ - \let \math@cr@@@ \math@cr@@@gather - \gmeasure@ {#1} - \global \shifttag@false - \tabskip \z@skip - \global \row@ \@ne - \halign to \displaywidth \bgroup - \strut@ - \setboxz@h { - $ - \m@th - \displaystyle - {##} - \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} - $ - } - \UseTaggingSocket{math/luamml/mtable/finalizecol}{box} - \calc@shift@gather - \set@gather@field - \tabskip\@centering - & - \setboxz@h { - \strut@ - {##} - } - \dim_compare:nNnTF {0pt} = { - \box_wd:N \c_zero_int - } - { \place@tag@gather } - { - \place@tag@gather - \UseTaggingSocket{math/luamml/mtable/tag/set} - } - \tabskip \iftagsleft@ - \gdisplaywidth@ - \else - \z@skip - \span \fi - \crcr - #1 -} -\cs_new_eq:NN \__luamml_amsmath_original_gmeasure:n \gmeasure@ -\cs_set:Npn \gmeasure@ #1 { - \exp_last_unbraced:Nno - \use_ii_i:nn - { \luamml_ignore: } - { \__luamml_amsmath_original_gmeasure:n {#1} } -} -\IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} - {} - { \PackageInfo{luamml}{patching~\string\endgather} + \PackageInfo{luamml}{patching~\string\endgather} \cs_set:Npn \endgather { \math@cr \black@ \totwidth@ @@ -252,7 +251,7 @@ \IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} {} { \PackageInfo{luamml}{patching~\string\maketag@@@} - \cs_set:Npn \maketag@@@ #1 + \cs_set:Npn \maketag@@@ #1 { \hbox { \m@th @@ -261,7 +260,7 @@ \UseTaggingSocket{math/luamml/mtable/tag/save} } } -% this handled in latex-lab through \common@align@ending +% this handled in latex-lab through \common@align@ending \cs_set:Npn \endalign { \math@cr \black@ \totwidth@ @@ -392,7 +391,7 @@ \scriptstyle ## % No \scriptsize here since we want to add the mstyle nodes - \UseTaggingSocket{math/luamml/save/nn}{ {} {mtd}} + \UseTaggingSocket{math/luamml/save/nn}{ {} {mtd}} $ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} \hfil @@ -405,7 +404,7 @@ \UseTaggingSocket{math/luamml/mtable/innertable/finalize} \UseTaggingSocket{ math/luamml/annotate/false } {}{ \, } } - } + } % {cases} is defined by the kernel, but we patch the overwritten version by amsmath. \cs_set:Npn \env@cases { From 36cfb020d21d2a0f4bc3fdf89985f61a2374967f Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Mon, 3 Feb 2025 00:31:57 +0100 Subject: [PATCH 169/206] use sockets --- luamml-patches-amsmath.sty | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index bc23b5d..ee173f3 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -305,14 +305,14 @@ % Less luckily, \endmultline@math sometimes get overwritten for the last line. % But that isn't a problem since we want special behavior there anyway. \cs_set:Npn \endmultline@math { - \luamml_save:nNn {} \displaystyle {mtd} + \UseTaggingSocket{math/luamml/save/nNn}{{} \displaystyle {mtd}} $ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} } \cs_set:Npn \rendmultline@ { \iftag@ - \luamml_save:nNn {} \displaystyle {mtd} + \UseTaggingSocket{math/luamml/save/nNn}{{} \displaystyle {mtd}} $ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} \let \endmultline@math \relax @@ -402,7 +402,7 @@ \egroup \egroup \UseTaggingSocket{math/luamml/mtable/innertable/finalize} - \UseTaggingSocket{ math/luamml/annotate/false } {}{ \, } + \UseTaggingSocket{math/luamml/annotate/false} {}{ \, } } } From 28d2b57997dd39ed95919211bb1b2cf67a808212 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 4 Feb 2025 01:09:22 +0100 Subject: [PATCH 170/206] move align commands to latex-lab --- luamml-patches-amsmath.sty | 159 +++++++++++++++++++------------------ 1 file changed, 80 insertions(+), 79 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index ee173f3..ffe1a05 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -164,88 +164,89 @@ $$ \ignorespacesafterend } - } + % align and friends -\cs_set:Npn \align@preamble { - & - \hfil - \strut@ - \setboxz@h { - \@lign - $ - \m@th - \displaystyle - {##} - \ifmeasuring@ - \luamml_ignore: - \else - \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} - \fi - $ - } - \ifmeasuring@ - \savefieldlength@ - \else - \UseTaggingSocket{math/luamml/mtable/finalizecol}{box} - \fi - \set@field - \tabskip\z@skip - & - \setboxz@h { - \@lign - $ - \m@th - \displaystyle - { - {} - ## - } - \ifmeasuring@ - \luamml_ignore: - \else - \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} - \fi - $ - } - \ifmeasuring@ - \savefieldlength@ - \else - \UseTaggingSocket{math/luamml/mtable/finalizecol}{box} - \fi - \set@field - \hfil - \tabskip\alignsep@ + \PackageInfo{luamml}{patching~\string\align@preamble} + \cs_set:Npn \align@preamble { + & + \hfil + \strut@ + \setboxz@h { + \@lign + $ + \m@th + \displaystyle + {##} + \ifmeasuring@ + \luamml_ignore: + \else + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} + \fi + $ + } + \ifmeasuring@ + \savefieldlength@ + \else + \UseTaggingSocket{math/luamml/mtable/finalizecol}{box} + \fi + \set@field + \tabskip\z@skip + & + \setboxz@h { + \@lign + $ + \m@th + \displaystyle + { + {} + ## + } + \ifmeasuring@ + \luamml_ignore: + \else + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} + \fi + $ + } + \ifmeasuring@ + \savefieldlength@ + \else + \UseTaggingSocket{math/luamml/mtable/finalizecol}{box} + \fi + \set@field + \hfil + \tabskip\alignsep@ + } + \PackageInfo{luamml}{patching~\string\math@cr@@@align} + \cs_set:Npn \math@cr@@@align { + \ifst@rred + \nonumber + \fi + \if@eqnsw + \global \tag@true + \fi + \global \advance \row@ \@ne + \add@amps \maxfields@ + \omit + \kern -\alignsep@ + \iftag@ + \setboxz@h { + \@lign + \strut@ + { \make@display@tag } + } + \place@tag + \UseTaggingSocket{math/luamml/mtable/tag/set} + \fi + \ifst@rred + \else + \global \@eqnswtrue + \fi + \global \lineht@ \z@ + \cr + } } - -\cs_set:Npn \math@cr@@@align { - \ifst@rred - \nonumber - \fi - \if@eqnsw - \global \tag@true - \fi - \global \advance \row@ \@ne - \add@amps \maxfields@ - \omit - \kern -\alignsep@ - \iftag@ - \setboxz@h { - \@lign - \strut@ - { \make@display@tag } - } - \place@tag - \UseTaggingSocket{math/luamml/mtable/tag/set} - \fi - \ifst@rred - \else - \global \@eqnswtrue - \fi - \global \lineht@ \z@ - \cr -} - % This was lost anyway, as the latex-lab code overwrites % the definition again. \IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} From 37a9ce1b992c253d0dc6f8fc3dbe7a263ba874f3 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Wed, 5 Feb 2025 14:40:25 +0100 Subject: [PATCH 171/206] ensure latex catcode --- luamml-structelemwriter.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index 957c29f..d681ff5 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -6,6 +6,8 @@ local struct_end = token.create'tag_struct_end:' local mc_begin = token.create'tag_mc_begin:n' local mc_end = token.create'tag_mc_end:' +local catlatex = luatexbase.registernumber("catcodetable@latex") + local function escape_name(name) return name end @@ -44,7 +46,7 @@ local attributes = setmetatable({}, {__index = function(t, k) local attr_name = string.format('luamml_attr_%i', attribute_counter) t[k] = attr_name tex.runtoks(function() - tex.sprint(string.format('\\tagpdfsetup{newattribute={%s}{/O/NSO/NS %i 0 R', + tex.sprint(catlatex,string.format('\\tagpdfsetup{newattribute={%s}{/O/NSO/NS %i 0 R', attr_name, mathml_ns_obj or get_mathml_ns_obj())) -- tex.sprint(string.format('\\tagpdfsetup{newattribute={%s}{/O/MathML-3', -- attr_name)) From cca4a39d898f459eea6e8bc1f6ff27e636070d2d Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Wed, 5 Feb 2025 23:45:11 +0100 Subject: [PATCH 172/206] ignore element with status tex:ignore --- luamml-structelemwriter.lua | 2 +- luamml-xmlwriter.lua | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index d681ff5..deda960 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -116,7 +116,7 @@ local function write_elem(tree, stash) end) end for _, elem in ipairs(tree) do - if type(elem) ~= 'string' then + if type(elem) ~= 'string' and not elem['tex:ignore'] then write_elem(elem) end end diff --git a/luamml-xmlwriter.lua b/luamml-xmlwriter.lua index 6880074..ad67845 100644 --- a/luamml-xmlwriter.lua +++ b/luamml-xmlwriter.lua @@ -48,7 +48,9 @@ local function write_elem(tree, indent) out = out .. escape_text(elem) is_string = true else - out = out .. write_elem(elem, inner_indent) + if not elem['tex:ignore'] then + out = out .. write_elem(elem, inner_indent) + end is_string = nil end end From 18e85d016adb57fe837ae5ce756793a26459856c Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Thu, 6 Feb 2025 01:17:22 +0100 Subject: [PATCH 173/206] move lbl into mtext, WIPgit add -p --- luamml-structelemwriter.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index deda960..35454af 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -117,6 +117,10 @@ local function write_elem(tree, stash) end for _, elem in ipairs(tree) do if type(elem) ~= 'string' and not elem['tex:ignore'] then + if elem['intent']==':equationlabel' and lastlblstructnum then + elem[1][#elem+1]={[':structnum']= lastlblstructnum} + lastlblstructnum=nil + end write_elem(elem) end end From 5c8d99818b1bbd837d3c7c955ff6745f797c4f6b Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Thu, 6 Feb 2025 16:58:09 +0100 Subject: [PATCH 174/206] add support for Lbl in math aligments --- luamml-structelemwriter.lua | 14 ++++++++--- luamml.dtx | 50 +++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index 35454af..372f548 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -8,6 +8,9 @@ local mc_end = token.create'tag_mc_end:' local catlatex = luatexbase.registernumber("catcodetable@latex") +ltx.__tag.struct.luamml = ltx.__tag.struct.luamml or {} +ltx.__tag.struct.luamml.labels = ltx.__tag.struct.luamml.labels or {} + local function escape_name(name) return name end @@ -117,10 +120,13 @@ local function write_elem(tree, stash) end for _, elem in ipairs(tree) do if type(elem) ~= 'string' and not elem['tex:ignore'] then - if elem['intent']==':equationlabel' and lastlblstructnum then - elem[1][#elem+1]={[':structnum']= lastlblstructnum} - lastlblstructnum=nil - end + if elem['intent']==':equationlabel' and ltx.__tag.struct.luamml.labels then + if #ltx.__tag.struct.luamml.labels > 0 then + -- print("CHECK LABEL STRUCTURE: ",table.serialize(elem), table.serialize(ltx.__tag.struct.luamml.labels)) + local num= table.remove(ltx.__tag.struct.luamml.labels,1) + elem[1][#elem+1]={[':structnum']= num} + end + end write_elem(elem) end end diff --git a/luamml.dtx b/luamml.dtx index 71f17d1..204b4ec 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -715,6 +715,7 @@ % % \end{macrocode} % +% \subsubsection{Tags and labels} % These sockets save and set tags and labels in alignments. % \begin{macrocode} \str_if_exist:cF { l__socket_tagsupport/math/luamml/mtable/tag/save_plug_str } @@ -738,6 +739,55 @@ % % \end{macrocode} +% +% If math structure elements are created the Lbl-structure of a tag +% must be moved inside the math structure, typically as an additional column in an +% \texttt{mtable} with an intent \texttt{:equationlabel}. +% +% The luamml-code handles this by stashing the Lbl-structure, storing the +% structure number in an array and reusing it once it creates the math structure elements. +% +% This should only be done for specific environments, we define +% a constant to test: +% \begin{macrocode} +%<*luatex> +\clist_map_inline:nn + { + align, + alignat, + xalignat, + xxalignat, + flalign, + gather, + %multline, % NO + %equation, % NO + } + {\tl_const:cn { c__luamml_label_#1_tl}{}} +% \end{macrocode} +% +% +% \begin{macrocode} +\NewSocketPlug{tagsupport/math/display/tag/begin}{luamml} + { + \tag_mc_end: + \bool_lazy_and:nnTF + { \tl_if_exist_p:c { c__luamml_label_ \@currenvir _tl } } + { \int_if_odd_p:n { \int_div_truncate:nn { \l__luamml_flag_int } { 8 } } } + { + \typeout{Stash~and~move~\@currenvir~Lbl} + \tag_struct_begin:n {tag=Lbl,stash} + \directlua{table.insert(ltx.__tag.struct.luamml.labels,\tag_get:n{struct_num})} + } + { + \tag_struct_begin:n {tag=Lbl} + } + \tag_mc_begin:n {} + } +\AssignSocketPlug{tagsupport/math/display/tag/begin}{luamml} +% +% \end{macrocode} +% +% % \subsubsection{Horizontal boxes} % This socket annotates an \cs{hbox} inside box commands used in math. % We test for the socket until the release 2025-06-01. From 29212f284c28d3cf70eafc601c3543430422027b Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 7 Feb 2025 01:06:46 +0100 Subject: [PATCH 175/206] move multline code --- luamml-patches-amsmath.sty | 54 ++++++++++++++++++++------------------ luamml.dtx | 23 +++++++++++++++- 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index ffe1a05..e62b6b6 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -246,12 +246,10 @@ \global \lineht@ \z@ \cr } -} + % This was lost anyway, as the latex-lab code overwrites % the definition again. -\IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} - {} - { \PackageInfo{luamml}{patching~\string\maketag@@@} + \PackageInfo{luamml}{patching~\string\maketag@@@} \cs_set:Npn \maketag@@@ #1 { \hbox { @@ -261,6 +259,7 @@ \UseTaggingSocket{math/luamml/mtable/tag/save} } } + \PackageInfo{luamml}{patching~\string\endalign} % this handled in latex-lab through \common@align@ending \cs_set:Npn \endalign { \math@cr @@ -277,29 +276,34 @@ \fi \ignorespacesafterend } -} + + \PackageInfo{luamml}{patching~\string\multline@} + % For a more interesting one, let's consider multline: + \cs_new_eq:NN \__luamml_amsmath_original_multline:n \multline@ + \cs_set:Npn \multline@ #1 { + \__luamml_amsmath_original_multline:n { + \ifmeasuring@ \else + \UseTaggingSocket{math/luamml/mtable/aligncol} {left} + \fi + #1 + \ifmeasuring@ \else + \UseTaggingSocket{math/luamml/mtable/aligncol} {right} + \fi + } + } -% For a more interesting one, let's consider multline: -\cs_new_eq:NN \__luamml_amsmath_original_multline:n \multline@ -\cs_set:Npn \multline@ #1 { - \__luamml_amsmath_original_multline:n { - \ifmeasuring@ \else - \__luamml_amsmath_set_row_columnalign:n {left} - \fi - #1 - \ifmeasuring@ \else - \__luamml_amsmath_set_row_columnalign:n {right} - \fi - } -} + %this is not move to latex-lab as the luamml_ignore is inserting with + % \measuringtrue + \PackageInfo{luamml}{patching~\string\mmeasure@} + \cs_new_eq:NN \__luamml_amsmath_original_mmeasure:n \mmeasure@ + \cs_set:Npn \mmeasure@ #1 { + \exp_last_unbraced:Nno + \use_ii_i:nn + { \luamml_ignore: } + { \__luamml_amsmath_original_mmeasure:n {#1} } + } + } % end package test -\cs_new_eq:NN \__luamml_amsmath_original_mmeasure:n \mmeasure@ -\cs_set:Npn \mmeasure@ #1 { - \exp_last_unbraced:Nno - \use_ii_i:nn - { \luamml_ignore: } - { \__luamml_amsmath_original_mmeasure:n {#1} } -} % Luckily, {multline} uses \endmultline@math in exactly % the spot where we have to set the flag. diff --git a/luamml.dtx b/luamml.dtx index 204b4ec..20b8360 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -692,7 +692,7 @@ \AssignSocketPlug{tagsupport/math/luamml/mtable/innertable/finalize}{luamml} % % \end{macrocode} - +% % % This socket finalize the \texttt{mtable} in alignments like align or gather. % It takes an argument, the environment. @@ -714,6 +714,27 @@ \AssignSocketPlug{tagsupport/math/luamml/mtable/finalize}{luamml} % % \end{macrocode} +% +% This socket adds attributes for the alignment in \texttt{multline}. +% It takes an argument, the alignment. +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/mtable/aligncol_plug_str } + { + \NewSocket{tagsupport/math/luamml/mtable/aligncol}{1} + \AssignSocketPlug{tagsupport/math/luamml/mtable/aligncol}{noop} + } +% \end{macrocode} +% +% \begin{macrocode} +%<*luatex> +\NewSocketPlug{tagsupport/math/luamml/mtable/aligncol}{luamml} + { + \__luamml_amsmath_set_row_columnalign:n {#1} + } +\AssignSocketPlug{tagsupport/math/luamml/mtable/aligncol}{luamml} +% +% \end{macrocode} + % % \subsubsection{Tags and labels} % These sockets save and set tags and labels in alignments. From 11ed5ffcbe382f60d879f56ad6fa4b1d944d44c2 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 7 Feb 2025 16:30:15 +0100 Subject: [PATCH 176/206] finish moving multline --- luamml-patches-amsmath.sty | 110 +++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 59 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index e62b6b6..c100ee5 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -302,72 +302,64 @@ { \luamml_ignore: } { \__luamml_amsmath_original_mmeasure:n {#1} } } - } % end package test - - % Luckily, {multline} uses \endmultline@math in exactly % the spot where we have to set the flag. % Less luckily, \endmultline@math sometimes get overwritten for the last line. % But that isn't a problem since we want special behavior there anyway. -\cs_set:Npn \endmultline@math { - \UseTaggingSocket{math/luamml/save/nNn}{{} \displaystyle {mtd}} - $ - \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} -} - -\cs_set:Npn \rendmultline@ { - \iftag@ + \PackageInfo{luamml}{patching~\string\endmultline@math} + \cs_set:Npn \endmultline@math { \UseTaggingSocket{math/luamml/save/nNn}{{} \displaystyle {mtd}} $ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} - \let \endmultline@math \relax - \ifshifttag@ - \hskip \multlinegap - \llap { - \vtop { - \raise@tag - \normalbaselines - \setbox \@ne \null - \dp \@ne \lineht@ - \box \@ne - \hbox { - \strut@ - \make@display@tag + } + \PackageInfo{luamml}{patching~\string\rendmultline@} + \cs_set:Npn \rendmultline@ { + \iftag@ + \UseTaggingSocket{math/luamml/save/nNn}{{} \displaystyle {mtd}} + $ + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} + \let \endmultline@math \relax + \ifshifttag@ + \hskip \multlinegap + \llap { + \vtop { + \raise@tag + \normalbaselines + \setbox \@ne \null + \dp \@ne \lineht@ + \box \@ne + \hbox { + \strut@ + \make@display@tag + } + } } - } - } - \else - \hskip \multlinetaggap - \make@display@tag - \fi - \UseTaggingSocket{math/luamml/mtable/tag/set} - \else - \hskip \multlinegap - \fi - \hfilneg - \math@cr - \UseExpandableTaggingSocket {math/luamml/mtable/finalize} {multline} - \egroup - $$ -} - -\cs_set:Npn \lendmultline@ { - \hfilneg - \hskip\multlinegap - \math@cr - \UseExpandableTaggingSocket {math/luamml/mtable/finalize} {multline} - %\__luamml_amsmath_finalize_table:n {multline} - \egroup - $$ -} - -% Finally some slightly different stuff. -% While {matrix} is covered by {array}, we still have {smallmatrix}: - -\IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} - {} - { \PackageInfo{luamml}{patching~smallmatrix} - + \else + \hskip \multlinetaggap + \make@display@tag + \fi + \UseTaggingSocket{math/luamml/mtable/tag/set} + \else + \hskip \multlinegap + \fi + \hfilneg + \math@cr + \UseExpandableTaggingSocket {math/luamml/mtable/finalize} {multline} + \egroup + $$ + } + \PackageInfo{luamml}{patching~\string\lendmultline@} + \cs_set:Npn \lendmultline@ { + \hfilneg + \hskip\multlinegap + \math@cr + \UseExpandableTaggingSocket {math/luamml/mtable/finalize} {multline} + %\__luamml_amsmath_finalize_table:n {multline} + \egroup + $$ + } + + \PackageInfo{luamml}{patching~smallmatrix} \renewenvironment {smallmatrix} { \UseTaggingSocket{ math/luamml/annotate/false } {} { \null\, } \vcenter \bgroup @@ -409,7 +401,7 @@ \UseTaggingSocket{math/luamml/mtable/innertable/finalize} \UseTaggingSocket{math/luamml/annotate/false} {}{ \, } } - } + } %end package test % {cases} is defined by the kernel, but we patch the overwritten version by amsmath. \cs_set:Npn \env@cases { From d6f438a532f06cc378e429af3d674072f78c8a71 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 7 Feb 2025 16:44:52 +0100 Subject: [PATCH 177/206] move cases --- luamml-patches-amsmath.sty | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index c100ee5..6baf949 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -401,17 +401,17 @@ \UseTaggingSocket{math/luamml/mtable/innertable/finalize} \UseTaggingSocket{math/luamml/annotate/false} {}{ \, } } + + % {cases} is defined by the kernel, but we patch the overwritten version by amsmath. + \PackageInfo{luamml}{patching~\string\env@cases} + \cs_set:Npn \env@cases { + \let \@ifnextchar \new@ifnextchar + \left \lbrace + \def \arraystretch {1.2} + \array {@{}l@{\quad \luamml_ignore:}l@{}} + } } %end package test -% {cases} is defined by the kernel, but we patch the overwritten version by amsmath. -\cs_set:Npn \env@cases { - \let \@ifnextchar \new@ifnextchar - \left \lbrace - \def \arraystretch {1.2} - \array {@{}l@{\quad \luamml_ignore:}l@{}} -} - - \cs_set:Npn \bBigg@ #1 #2 { { \ensuremath { From b0149a45a36eaa012e5f260e5352fe235fa5a37c Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 7 Feb 2025 17:13:23 +0100 Subject: [PATCH 178/206] move mathtool patch --- luamml-patches-mathtools.sty | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/luamml-patches-mathtools.sty b/luamml-patches-mathtools.sty index 3dc1570..76a9685 100644 --- a/luamml-patches-mathtools.sty +++ b/luamml-patches-mathtools.sty @@ -25,9 +25,9 @@ \MH_fi: \ialign\bgroup \hfil\strut@$\m@th\displaystyle{}## - \luamml_save:nNn {} \displaystyle {mtd} + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} $ - \__luamml_amsmath_add_last_to_row: + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} \hfil \crcr \hfilneg From f8a3d35aa152a305bd7f09d5c5446b67b37ab8a0 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 7 Feb 2025 17:40:27 +0100 Subject: [PATCH 179/206] move mathtool patch --- luamml-patches-mathtools.sty | 67 +++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/luamml-patches-mathtools.sty b/luamml-patches-mathtools.sty index 76a9685..e520190 100644 --- a/luamml-patches-mathtools.sty +++ b/luamml-patches-mathtools.sty @@ -1,35 +1,38 @@ \ProvidesExplPackage {luamml-patches-mathtools} {2024-10-26} {0.2.0} {Feel free to add a description here} - -\RequirePackage{luamml-patches-amsmath} -% see https://github.com/latex3/tagging-project/issues/734 -\renewcommand*\MT_mult_internal:n [1]{ - \MH_if_boolean:nF {outer_mult}{\alignedspace@left} %<-- requires amsmath 2016/11/05 - \MT_next: - \bgroup - \Let@ - \def\l_MT_multline_lastline_fint{0 } - \chardef\dspbrk@context\@ne \restore@math@cr - \MH_let:NwN \math@cr@@\MT_mult_mathcr_atat:w - \MH_let:NwN \shoveleft\MT_shoveleft:wn - \MH_let:NwN \shoveright\MT_shoveright:wn - \spread@equation - \MH_set_boolean_F:n {mult_firstline} - \MT_measure_mult:n {#1} - \MH_if_dim:w \l_MT_multwidth_dim<\l_MT_multline_measure_fdim - \MH_setlength:dn \l_MT_multwidth_dim{\l_MT_multline_measure_fdim} - \fi - \MH_set_boolean_T:n {mult_firstline} - \MH_if_num:w \l_MT_multline_lastline_fint=\@ne - \MH_let:NwN \math@cr@@ \MT_mult_firstandlast_mathcr:w - \MH_fi: - \ialign\bgroup - \hfil\strut@$\m@th\displaystyle{}## - \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} - $ - \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} - \hfil - \crcr - \hfilneg - #1 +\IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} + {} + { + \RequirePackage{luamml-patches-amsmath} + % see https://github.com/latex3/tagging-project/issues/734 + \renewcommand*\MT_mult_internal:n [1]{ + \MH_if_boolean:nF {outer_mult}{\alignedspace@left} %<-- requires amsmath 2016/11/05 + \MT_next: + \bgroup + \Let@ + \def\l_MT_multline_lastline_fint{0 } + \chardef\dspbrk@context\@ne \restore@math@cr + \MH_let:NwN \math@cr@@\MT_mult_mathcr_atat:w + \MH_let:NwN \shoveleft\MT_shoveleft:wn + \MH_let:NwN \shoveright\MT_shoveright:wn + \spread@equation + \MH_set_boolean_F:n {mult_firstline} + \MT_measure_mult:n {#1} + \MH_if_dim:w \l_MT_multwidth_dim<\l_MT_multline_measure_fdim + \MH_setlength:dn \l_MT_multwidth_dim{\l_MT_multline_measure_fdim} + \fi + \MH_set_boolean_T:n {mult_firstline} + \MH_if_num:w \l_MT_multline_lastline_fint=\@ne + \MH_let:NwN \math@cr@@ \MT_mult_firstandlast_mathcr:w + \MH_fi: + \ialign\bgroup + \hfil\strut@$\m@th\displaystyle{}## + \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}} + $ + \UseTaggingSocket{math/luamml/mtable/finalizecol}{last} + \hfil + \crcr + \hfilneg + #1 + } } From 398aa189fe6104b1579efa925af6bfd183e690fe Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sat, 8 Feb 2025 11:40:49 +0100 Subject: [PATCH 180/206] tag rows with no tag with an empty mtd --- luamml-amsmath.lua | 9 +++++---- luamml-table.lua | 7 +++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index 2b74265..26b157b 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -3,6 +3,7 @@ local make_root = require'luamml-convert'.make_root local save_result = require'luamml-tex'.save_result local store_column = require'luamml-table'.store_column local store_tag = require'luamml-table'.store_tag +local store_notag = require'luamml-table'.store_notag local get_table = require'luamml-table'.get_table local set_row_attribute = require'luamml-table'.set_row_attribute local to_text = require'luamml-lr' @@ -125,9 +126,9 @@ funcid = luatexbase.new_luafunction'__luamml_amsmath_set_tag:' token.set_lua('__luamml_amsmath_set_tag:', funcid, 'protected') lua.get_functions_table()[funcid] = function() if not last_tag then - texio.write_nl'WARNING: Tag extraction failed' - return + store_notag({[0] = 'mtd',''}) + else + store_tag({[0] = 'mtd', last_tag}) + last_tag = nil end - store_tag({[0] = 'mtd', last_tag}) - last_tag = nil end diff --git a/luamml-table.lua b/luamml-table.lua index 4fb553a..2333104 100644 --- a/luamml-table.lua +++ b/luamml-table.lua @@ -63,6 +63,12 @@ local function store_tag(xml) last_tag = nil end +local function store_notag(xml) + local mml_row = store_get_row() + xml.intent = ':noequationlabel' + table.insert(mml_row, 1, xml) +end + local function set_row_attribute(name, value) local mml_row = store_get_row() mml_row[name] = value @@ -105,6 +111,7 @@ return { store_column = store_column, store_column_xml = store_column_xml, store_tag = store_tag, + store_notag = store_notag, set_row_attribute = set_row_attribute, get_table = get_table, } From ecde594cd3b8d68a2d90cc8069078670d5ce06a7 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sun, 9 Feb 2025 18:33:43 +0100 Subject: [PATCH 181/206] correct and clean up label handling --- luamml.dtx | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/luamml.dtx b/luamml.dtx index 20b8360..3426b45 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -775,13 +775,32 @@ \clist_map_inline:nn { align, + align*, alignat, + alignat*, xalignat, - xxalignat, + xalignat*, +% \end{macrocode} +% there is never a tag/label in xxalignat, so does it make sense to add a label column? +% Left out for now. +% \begin{macrocode} + %xxalignat, flalign, + flalign*, gather, + gather*, +% \end{macrocode} +% equation and multline have at most one tag, so we do not use a label column +% but rely on the external Lbl for now. +% \begin{macrocode} %multline, % NO + %multline*, % NO %equation, % NO + %equation*, % NO +% \end{macrocode} +% split has never a numbering so is ignored +% \begin{macrocode} + %split, % NO } {\tl_const:cn { c__luamml_label_#1_tl}{}} % \end{macrocode} @@ -795,7 +814,7 @@ { \tl_if_exist_p:c { c__luamml_label_ \@currenvir _tl } } { \int_if_odd_p:n { \int_div_truncate:nn { \l__luamml_flag_int } { 8 } } } { - \typeout{Stash~and~move~\@currenvir~Lbl} + %\typeout{Stash~and~move~\@currenvir\c_space_tl Lbl} \tag_struct_begin:n {tag=Lbl,stash} \directlua{table.insert(ltx.__tag.struct.luamml.labels,\tag_get:n{struct_num})} } From 8f864361a909f42ec2522eb4b6f1bb934b8e51e7 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sun, 9 Feb 2025 22:58:59 +0100 Subject: [PATCH 182/206] provide missing socket --- luamml.dtx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/luamml.dtx b/luamml.dtx index 3426b45..a5579e0 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -771,6 +771,14 @@ % This should only be done for specific environments, we define % a constant to test: % \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/math/luamml/mtable/tag/begin_plug_str } + { + \NewSocket{tagsupport/math/display/tag/begin}{0} + \NewSocket{tagsupport/math/display/tag/end}{0} + } +% \end{macrocode} +% +% \begin{macrocode} %<*luatex> \clist_map_inline:nn { From 7bca165095d8fbb7b02cc406af5082cab9271de2 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sun, 9 Feb 2025 23:35:02 +0100 Subject: [PATCH 183/206] correct socket name --- luamml.dtx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luamml.dtx b/luamml.dtx index a5579e0..f2c85fd 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -771,7 +771,7 @@ % This should only be done for specific environments, we define % a constant to test: % \begin{macrocode} -\str_if_exist:cF { l__socket_tagsupport/math/luamml/mtable/tag/begin_plug_str } +\str_if_exist:cF { l__socket_tagsupport/math/display/tag/begin_plug_str } { \NewSocket{tagsupport/math/display/tag/begin}{0} \NewSocket{tagsupport/math/display/tag/end}{0} From f68f45f2c869c918074964cfe4cdad33e57aa6d8 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Mon, 10 Feb 2025 17:01:36 +0100 Subject: [PATCH 184/206] more clean up --- luamml-patches-amsmath.sty | 18 +++++++++--------- luamml-patches-kernel.sty | 9 +++++---- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 6baf949..66ffdbe 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -410,12 +410,12 @@ \def \arraystretch {1.2} \array {@{}l@{\quad \luamml_ignore:}l@{}} } - } %end package test - -\cs_set:Npn \bBigg@ #1 #2 { - { - \ensuremath { - \Uvextensible height~#1 \big@size axis~exact~#2 - } - } -} + \PackageInfo{luamml}{patching~\string\bBigg@} + \cs_set:Npn \bBigg@ #1 #2 { + { + \ensuremath { + \Uvextensible height~#1 \big@size axis~exact~#2 + } + } + } +} %end package test diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index 36824a8..bcd3064 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -52,8 +52,13 @@ \finph@nt } } + \IfFileLoadedT {latex-lab-math.ltx} { + \RequirePackage{luamml-patches-lab-math} + } } +% This is not moved to latex-lab for now. It doesn't work properly with structure elements +% active: the content is outside of the math. \@ifpackageloaded {unicode-math} {} { \cs_new:Npn \__luamml_kernel_define_character:Nnn #1#2#3 { \cs_set:cpx { \cs_to_str:N #1 ~ } { @@ -77,7 +82,3 @@ \__luamml_kernel_define_character:Nnn \longleftrightarrow {3} {27f7} \__luamml_kernel_define_character:Nnn \longmapsto {4} {27fc} } - -\IfFileLoadedT {latex-lab-math.ltx} { - \RequirePackage{luamml-patches-lab-math} -} From 6fcc97573533de7f27556b10cf418ab00aff709d Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 11 Feb 2025 09:36:08 +0100 Subject: [PATCH 185/206] ensure that lua table exist --- luamml-structelemwriter.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index 372f548..3087305 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -8,6 +8,9 @@ local mc_end = token.create'tag_mc_end:' local catlatex = luatexbase.registernumber("catcodetable@latex") +ltx = ltx or {} +ltx.__tag = ltx.__tag or {} +ltx.__tag.struct = ltx.__tag.struct or {} ltx.__tag.struct.luamml = ltx.__tag.struct.luamml or {} ltx.__tag.struct.luamml.labels = ltx.__tag.struct.luamml.labels or {} From 8da22d184e9bd84617b8e75c95b9119c73a511f2 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 11 Feb 2025 09:40:56 +0100 Subject: [PATCH 186/206] update test, NS change --- testfiles-lua/test_sqrt.tpf | 146 ++++++++++++++++++------------------ 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/testfiles-lua/test_sqrt.tpf b/testfiles-lua/test_sqrt.tpf index 5b360d5..146bbb7 100644 --- a/testfiles-lua/test_sqrt.tpf +++ b/testfiles-lua/test_sqrt.tpf @@ -513,13 +513,13 @@ endobj << /title [/Title 11 0 R] /part [/Title 11 0 R] /section [/H1 11 0 R] /subsection [/H2 11 0 R] /subsubsection [/H3 11 0 R] /paragraph [/H4 11 0 R] /subparagraph [/H5 11 0 R] /list [/L 11 0 R] /itemize [/L 11 0 R] /enumerate [/L 11 0 R] /description [/L 11 0 R] /quote [/BlockQuote 9 0 R] /quotation [/BlockQuote 9 0 R] /verbatim [/P 11 0 R] /item [/LI 11 0 R] /itemlabel [/Lbl 11 0 R] /itembody [/LBody 11 0 R] /footnote [/FENote 11 0 R] /footnotemark [/Lbl 11 0 R] /footnotelabel [/Lbl 11 0 R] /text-unit [/Part 11 0 R] /text [/P 11 0 R] /theorem-like [/Sect 11 0 R] /codeline [/Sub 11 0 R] /float [/Aside 11 0 R] /figures [/Sect 11 0 R] /tables [/Sect 11 0 R] >> endobj 15 0 obj -<< /Type /Namespace /NS (https://www.latex-project.org/ns/dflt/2022) /RoleMapNS 16 0 R >> +<< /Type /Namespace /NS (https://www.latex-project.org/ns/dflt) /RoleMapNS 16 0 R >> endobj 18 0 obj << /chapter [/H1 11 0 R] /section [/H2 11 0 R] /subsection [/H3 11 0 R] /subsubsection [/H4 11 0 R] /paragraph [/H5 11 0 R] /subparagraph [/H6 11 0 R] >> endobj 17 0 obj -<< /Type /Namespace /NS (https://www.latex-project.org/ns/book/2022) /RoleMapNS 18 0 R >> +<< /Type /Namespace /NS (https://www.latex-project.org/ns/book) /RoleMapNS 18 0 R >> endobj 19 0 obj << /Type /Namespace /NS (data:,C9B55C18-275C-494E-C10F-E4B83CD03F23) >> @@ -875,10 +875,10 @@ xref 0000000003 00000 f 0000000004 00000 f 0000000010 00000 f -0000025392 00000 n +0000025382 00000 n 0000017844 00000 n 0000018694 00000 n -0000020849 00000 n +0000020839 00000 n 0000019474 00000 n 0000000012 00000 f 0000019542 00000 n @@ -887,11 +887,11 @@ xref 0000000020 00000 f 0000020375 00000 n 0000019693 00000 n -0000020653 00000 n -0000020482 00000 n -0000020760 00000 n +0000020648 00000 n +0000020477 00000 n +0000020750 00000 n 0000000000 00000 f -0000020910 00000 n +0000020900 00000 n 0000000020 00000 n 0000000257 00000 n 0000000444 00000 n @@ -900,91 +900,91 @@ xref 0000001291 00000 n 0000001478 00000 n 0000001726 00000 n -0000021031 00000 n -0000021119 00000 n -0000021207 00000 n -0000021307 00000 n -0000021418 00000 n +0000021021 00000 n +0000021109 00000 n +0000021197 00000 n +0000021297 00000 n +0000021408 00000 n 0000001913 00000 n 0000002067 00000 n -0000021610 00000 n -0000021705 00000 n -0000021801 00000 n -0000021922 00000 n -0000022022 00000 n -0000022133 00000 n +0000021600 00000 n +0000021695 00000 n +0000021791 00000 n +0000021912 00000 n +0000022012 00000 n +0000022123 00000 n 0000002267 00000 n 0000002433 00000 n -0000022325 00000 n -0000022436 00000 n -0000022532 00000 n -0000022628 00000 n -0000022749 00000 n +0000022315 00000 n +0000022426 00000 n +0000022522 00000 n +0000022618 00000 n +0000022739 00000 n 0000002633 00000 n -0000022881 00000 n -0000023002 00000 n -0000023102 00000 n -0000023213 00000 n +0000022871 00000 n +0000022992 00000 n +0000023092 00000 n +0000023203 00000 n 0000002704 00000 n 0000002875 00000 n -0000023474 00000 n -0000023585 00000 n -0000023706 00000 n +0000023464 00000 n +0000023575 00000 n +0000023696 00000 n 0000003075 00000 n -0000023838 00000 n -0000023934 00000 n -0000024039 00000 n -0000024143 00000 n -0000024265 00000 n -0000024387 00000 n -0000024509 00000 n -0000024609 00000 n -0000024720 00000 n +0000023828 00000 n +0000023924 00000 n +0000024029 00000 n +0000024133 00000 n +0000024255 00000 n +0000024377 00000 n +0000024499 00000 n +0000024599 00000 n +0000024710 00000 n 0000003146 00000 n 0000003303 00000 n -0000024948 00000 n -0000025043 00000 n -0000025148 00000 n -0000025270 00000 n +0000024938 00000 n +0000025033 00000 n +0000025138 00000 n +0000025260 00000 n 0000003503 00000 n 0000017560 00000 n 0000017425 00000 n 0000015284 00000 n -0000034805 00000 n -0000031616 00000 n -0000029375 00000 n -0000027191 00000 n -0000035176 00000 n +0000034795 00000 n +0000031606 00000 n +0000029365 00000 n +0000027181 00000 n +0000035166 00000 n 0000017706 00000 n 0000017742 00000 n 0000018006 00000 n 0000018657 00000 n 0000019273 00000 n -0000025529 00000 n -0000026218 00000 n -0000025560 00000 n -0000026439 00000 n -0000027345 00000 n -0000027545 00000 n -0000028364 00000 n -0000027578 00000 n -0000028593 00000 n -0000029535 00000 n -0000029741 00000 n -0000030602 00000 n -0000029774 00000 n -0000030833 00000 n -0000031778 00000 n -0000031987 00000 n -0000033686 00000 n -0000032090 00000 n -0000033916 00000 n -0000034967 00000 n -0000035238 00000 n -0000035283 00000 n -0000035414 00000 n +0000025519 00000 n +0000026208 00000 n +0000025550 00000 n +0000026429 00000 n +0000027335 00000 n +0000027535 00000 n +0000028354 00000 n +0000027568 00000 n +0000028583 00000 n +0000029525 00000 n +0000029731 00000 n +0000030592 00000 n +0000029764 00000 n +0000030823 00000 n +0000031768 00000 n +0000031977 00000 n +0000033676 00000 n +0000032080 00000 n +0000033906 00000 n +0000034957 00000 n +0000035228 00000 n +0000035273 00000 n +0000035404 00000 n trailer << /Size 113 /Root 111 0 R /Info 112 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> startxref -35547 +35537 %%EOF From 4bed8d523ba8024f7ca2110b3cdeff1997ea37cf Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Tue, 11 Feb 2025 09:53:43 +0100 Subject: [PATCH 187/206] update testfiles (empty mi, NS) --- testfiles-lua/test_struct.tpf | 896 +++++++++++++++---------------- testfiles-lua/test_structnum.tpf | 138 ++--- testfiles-lua/test_xml.mlr | 23 +- 3 files changed, 506 insertions(+), 551 deletions(-) diff --git a/testfiles-lua/test_struct.tpf b/testfiles-lua/test_struct.tpf index 4149ac6..034a986 100644 --- a/testfiles-lua/test_struct.tpf +++ b/testfiles-lua/test_struct.tpf @@ -28,9 +28,9 @@ endobj << /Type /Filespec /AFRelationship /Supplement /Desc (mathml-3) /F (mathml-3.xml) /UF /EF<> >> endobj 28 0 obj -<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 1062 >> +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 1014 >> stream - ๐‘Ž ๐‘ ๐‘ = ๐‘‘ ๐‘’ ๐‘“ ๐‘’ i ๐œ‹ = โˆ’ 1 ( 1 + 2 = 3 ) 5 + ๐‘Ž ๐‘ ๐‘ = ๐‘‘ ๐‘’ ๐‘“ ๐‘’ i ๐œ‹ = โˆ’ 1 ( 1 + 2 = 3 ) 5 endstream endobj 29 0 obj @@ -117,28 +117,28 @@ endobj 146 0 obj << /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile4.tex) /UF /EF<> >> endobj -166 0 obj +164 0 obj << /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0) >> endobj -172 0 obj +170 0 obj << /O/NSO/NS 13 0 R/fence(true)/lspace(0)/maxsize(17.861pt)/minsize(17.861pt)/rspace(0)/symmetric(true) >> endobj -197 0 obj +189 0 obj << /O/NSO/NS 13 0 R/columnalign(right left right left)/columnspacing(0 .8em 0)/displaystyle(true) >> endobj -204 0 obj +196 0 obj << /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 27 >> stream $\sin (x)-\sin (x+2\pi )=0$ endstream endobj -205 0 obj -<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile5.tex) /UF /EF<> >> +197 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile5.tex) /UF /EF<> >> endobj -209 0 obj +201 0 obj << /O/NSO/NS 13 0 R/lspace(0)/rspace(0)/stretchy(false) >> endobj -222 0 obj +214 0 obj << /Type /Metadata /Subtype /XML /Length 11693 >> stream @@ -372,7 +372,7 @@ stream endstream endobj -225 0 obj +217 0 obj << /Length 8458 >> stream /opacity1 gs @@ -976,44 +976,44 @@ EMC EMC endstream endobj -224 0 obj -<< /Type /Page /Contents 225 0 R /Resources 223 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 230 0 R >> +216 0 obj +<< /Type /Page /Contents 217 0 R /Resources 215 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 222 0 R >> endobj -223 0 obj -<< /ExtGState 1 0 R /Font << /F15 226 0 R /F20 227 0 R /F21 228 0 R /F32 229 0 R >> >> +215 0 obj +<< /ExtGState 1 0 R /Font << /F15 218 0 R /F20 219 0 R /F21 220 0 R /F32 221 0 R >> >> endobj 1 0 obj << /opacity1 <> >> endobj -231 0 obj +223 0 obj << /Marked true >> endobj -232 0 obj +224 0 obj << /Names[(l3ef0001) 23 0 R (l3ef0002) 25 0 R (l3ef0003) 27 0 R (l3ef0004) 29 0 R (l3ef0005) 31 0 R] >> endobj 6 0 obj -<< /Nums [0 [ 35 0 R 74 0 R 37 0 R 41 0 R 43 0 R 45 0 R 37 0 R 47 0 R 49 0 R 51 0 R 37 0 R 53 0 R 55 0 R 57 0 R 85 0 R 86 0 R 88 0 R 59 0 R 60 0 R 62 0 R 63 0 R 65 0 R 68 0 R 69 0 R 100 0 R 101 0 R 104 0 R 106 0 R 107 0 R 96 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 96 0 R 119 0 R 120 0 R 121 0 R 129 0 R 131 0 R 133 0 R 124 0 R 137 0 R 136 0 R 140 0 R 141 0 R 144 0 R 148 0 R 149 0 R 150 0 R 153 0 R 154 0 R 155 0 R 156 0 R 159 0 R 161 0 R 162 0 R 165 0 R 167 0 R 168 0 R 169 0 R 144 0 R 171 0 R 173 0 R 174 0 R 175 0 R 178 0 R 179 0 R 180 0 R 185 0 R 144 0 R 187 0 R 194 0 R 202 0 R 203 0 R 207 0 R 208 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 202 0 R] +<< /Nums [0 [ 35 0 R 74 0 R 37 0 R 41 0 R 43 0 R 45 0 R 37 0 R 47 0 R 49 0 R 51 0 R 37 0 R 53 0 R 55 0 R 57 0 R 85 0 R 86 0 R 88 0 R 59 0 R 60 0 R 62 0 R 63 0 R 65 0 R 68 0 R 69 0 R 100 0 R 101 0 R 104 0 R 106 0 R 107 0 R 96 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 96 0 R 119 0 R 120 0 R 121 0 R 129 0 R 131 0 R 133 0 R 124 0 R 137 0 R 136 0 R 140 0 R 141 0 R 144 0 R 148 0 R 149 0 R 150 0 R 152 0 R 153 0 R 154 0 R 155 0 R 158 0 R 160 0 R 161 0 R 163 0 R 165 0 R 166 0 R 167 0 R 144 0 R 169 0 R 171 0 R 172 0 R 173 0 R 175 0 R 176 0 R 177 0 R 180 0 R 144 0 R 182 0 R 186 0 R 194 0 R 195 0 R 199 0 R 200 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 194 0 R] ] >> endobj -233 0 obj +225 0 obj << /Limits [(ID.0002) (ID.0051)]/Names [(ID.0002) 21 0 R (ID.0003) 32 0 R (ID.0004) 33 0 R (ID.0005) 34 0 R (ID.0006) 35 0 R (ID.0007) 36 0 R (ID.0008) 37 0 R (ID.0009) 40 0 R (ID.0010) 41 0 R (ID.0011) 42 0 R (ID.0012) 43 0 R (ID.0013) 44 0 R (ID.0014) 45 0 R (ID.0015) 46 0 R (ID.0016) 47 0 R (ID.0017) 48 0 R (ID.0018) 49 0 R (ID.0019) 50 0 R (ID.0020) 51 0 R (ID.0021) 52 0 R (ID.0022) 53 0 R (ID.0023) 54 0 R (ID.0024) 55 0 R (ID.0025) 56 0 R (ID.0026) 57 0 R (ID.0027) 58 0 R (ID.0028) 59 0 R (ID.0029) 60 0 R (ID.0030) 61 0 R (ID.0031) 62 0 R (ID.0032) 63 0 R (ID.0033) 65 0 R (ID.0034) 66 0 R (ID.0035) 67 0 R (ID.0036) 68 0 R (ID.0037) 69 0 R (ID.0038) 70 0 R (ID.0039) 71 0 R (ID.0040) 73 0 R (ID.0041) 74 0 R (ID.0042) 76 0 R (ID.0043) 78 0 R (ID.0044) 80 0 R (ID.0045) 81 0 R (ID.0046) 82 0 R (ID.0047) 83 0 R (ID.0048) 84 0 R (ID.0049) 85 0 R (ID.0050) 86 0 R (ID.0051) 87 0 R ] >> endobj -234 0 obj +226 0 obj << /Limits [(ID.0052) (ID.0101)]/Names [(ID.0052) 88 0 R (ID.0053) 89 0 R (ID.0054) 90 0 R (ID.0055) 91 0 R (ID.0056) 92 0 R (ID.0057) 93 0 R (ID.0058) 95 0 R (ID.0059) 96 0 R (ID.0060) 99 0 R (ID.0061) 100 0 R (ID.0062) 101 0 R (ID.0063) 102 0 R (ID.0064) 103 0 R (ID.0065) 104 0 R (ID.0066) 106 0 R (ID.0067) 107 0 R (ID.0068) 109 0 R (ID.0069) 110 0 R (ID.0070) 111 0 R (ID.0071) 112 0 R (ID.0072) 113 0 R (ID.0073) 114 0 R (ID.0074) 115 0 R (ID.0075) 116 0 R (ID.0076) 117 0 R (ID.0077) 118 0 R (ID.0078) 119 0 R (ID.0079) 120 0 R (ID.0080) 121 0 R (ID.0081) 123 0 R (ID.0082) 124 0 R (ID.0083) 127 0 R (ID.0084) 128 0 R (ID.0085) 129 0 R (ID.0086) 131 0 R (ID.0087) 132 0 R (ID.0088) 133 0 R (ID.0089) 134 0 R (ID.0090) 135 0 R (ID.0091) 136 0 R (ID.0092) 137 0 R (ID.0093) 139 0 R (ID.0094) 140 0 R (ID.0095) 141 0 R (ID.0096) 143 0 R (ID.0097) 144 0 R (ID.0098) 147 0 R (ID.0099) 148 0 R (ID.0100) 149 0 R (ID.0101) 150 0 R ] >> endobj -235 0 obj -<< /Limits [(ID.0102) (ID.0151)]/Names [(ID.0102) 151 0 R (ID.0103) 152 0 R (ID.0104) 153 0 R (ID.0105) 154 0 R (ID.0106) 155 0 R (ID.0107) 156 0 R (ID.0108) 157 0 R (ID.0109) 158 0 R (ID.0110) 159 0 R (ID.0111) 160 0 R (ID.0112) 161 0 R (ID.0113) 162 0 R (ID.0114) 163 0 R (ID.0115) 164 0 R (ID.0116) 165 0 R (ID.0117) 167 0 R (ID.0118) 168 0 R (ID.0119) 169 0 R (ID.0120) 170 0 R (ID.0121) 171 0 R (ID.0122) 173 0 R (ID.0123) 174 0 R (ID.0124) 175 0 R (ID.0125) 176 0 R (ID.0126) 177 0 R (ID.0127) 178 0 R (ID.0128) 179 0 R (ID.0129) 180 0 R (ID.0130) 181 0 R (ID.0131) 182 0 R (ID.0132) 183 0 R (ID.0133) 184 0 R (ID.0134) 185 0 R (ID.0135) 186 0 R (ID.0136) 187 0 R (ID.0137) 188 0 R (ID.0138) 189 0 R (ID.0139) 190 0 R (ID.0140) 191 0 R (ID.0141) 192 0 R (ID.0142) 193 0 R (ID.0143) 194 0 R (ID.0144) 195 0 R (ID.0145) 196 0 R (ID.0146) 198 0 R (ID.0147) 199 0 R (ID.0148) 200 0 R (ID.0149) 201 0 R (ID.0150) 202 0 R (ID.0151) 203 0 R ] >> +227 0 obj +<< /Limits [(ID.0102) (ID.0151)]/Names [(ID.0102) 151 0 R (ID.0103) 152 0 R (ID.0104) 153 0 R (ID.0105) 154 0 R (ID.0106) 155 0 R (ID.0107) 156 0 R (ID.0108) 157 0 R (ID.0109) 158 0 R (ID.0110) 159 0 R (ID.0111) 160 0 R (ID.0112) 161 0 R (ID.0113) 162 0 R (ID.0114) 163 0 R (ID.0115) 165 0 R (ID.0116) 166 0 R (ID.0117) 167 0 R (ID.0118) 168 0 R (ID.0119) 169 0 R (ID.0120) 171 0 R (ID.0121) 172 0 R (ID.0122) 173 0 R (ID.0123) 174 0 R (ID.0124) 175 0 R (ID.0125) 176 0 R (ID.0126) 177 0 R (ID.0127) 178 0 R (ID.0128) 179 0 R (ID.0129) 180 0 R (ID.0130) 181 0 R (ID.0131) 182 0 R (ID.0132) 183 0 R (ID.0133) 184 0 R (ID.0134) 185 0 R (ID.0135) 186 0 R (ID.0136) 187 0 R (ID.0137) 188 0 R (ID.0138) 190 0 R (ID.0139) 191 0 R (ID.0140) 192 0 R (ID.0141) 193 0 R (ID.0142) 194 0 R (ID.0143) 195 0 R (ID.0144) 198 0 R (ID.0145) 199 0 R (ID.0146) 200 0 R (ID.0147) 202 0 R (ID.0148) 203 0 R (ID.0149) 204 0 R (ID.0150) 205 0 R (ID.0151) 206 0 R ] >> endobj -236 0 obj -<< /Limits [(ID.0152) (ID.0166)]/Names [(ID.0152) 206 0 R (ID.0153) 207 0 R (ID.0154) 208 0 R (ID.0155) 210 0 R (ID.0156) 211 0 R (ID.0157) 212 0 R (ID.0158) 213 0 R (ID.0159) 214 0 R (ID.0160) 215 0 R (ID.0161) 216 0 R (ID.0162) 217 0 R (ID.0163) 218 0 R (ID.0164) 219 0 R (ID.0165) 220 0 R (ID.0166) 221 0 R ] >> +228 0 obj +<< /Limits [(ID.0152) (ID.0158)]/Names [(ID.0152) 207 0 R (ID.0153) 208 0 R (ID.0154) 209 0 R (ID.0155) 210 0 R (ID.0156) 211 0 R (ID.0157) 212 0 R (ID.0158) 213 0 R ] >> endobj -237 0 obj -<< /Kids [233 0 R 234 0 R 235 0 R 236 0 R] >> +229 0 obj +<< /Kids [225 0 R 226 0 R 227 0 R 228 0 R] >> endobj 7 0 obj << /Artifact /NonStruct /DocumentFragment /Art /Aside /Note /H7 /H6 /H8 /H6 /H9 /H6 /H10 /H6 /Title /P /FENote /Note /Sub /Span /Em /Span /Strong /Span /title /P /part /P /section /H1 /subsection /H2 /subsubsection /H3 /paragraph /H4 /subparagraph /H5 /list /L /itemize /L /enumerate /L /description /L /quote /BlockQuote /quotation /BlockQuote /verbatim /P /item /LI /itemlabel /Lbl /itembody /LBody /footnote /Note /footnotemark /Lbl /footnotelabel /Lbl /text-unit /Part /text /P /theorem-like /Sect /codeline /Span /float /Note /figures /Sect /tables /Sect >> endobj -238 0 obj +230 0 obj << /justify <> /display <> /inline <> @@ -1035,13 +1035,13 @@ endobj << /title [/Title 11 0 R] /part [/Title 11 0 R] /section [/H1 11 0 R] /subsection [/H2 11 0 R] /subsubsection [/H3 11 0 R] /paragraph [/H4 11 0 R] /subparagraph [/H5 11 0 R] /list [/L 11 0 R] /itemize [/L 11 0 R] /enumerate [/L 11 0 R] /description [/L 11 0 R] /quote [/BlockQuote 9 0 R] /quotation [/BlockQuote 9 0 R] /verbatim [/P 11 0 R] /item [/LI 11 0 R] /itemlabel [/Lbl 11 0 R] /itembody [/LBody 11 0 R] /footnote [/FENote 11 0 R] /footnotemark [/Lbl 11 0 R] /footnotelabel [/Lbl 11 0 R] /text-unit [/Part 11 0 R] /text [/P 11 0 R] /theorem-like [/Sect 11 0 R] /codeline [/Sub 11 0 R] /float [/Aside 11 0 R] /figures [/Sect 11 0 R] /tables [/Sect 11 0 R] >> endobj 15 0 obj -<< /Type /Namespace /NS (https://www.latex-project.org/ns/dflt/2022) /RoleMapNS 16 0 R >> +<< /Type /Namespace /NS (https://www.latex-project.org/ns/dflt) /RoleMapNS 16 0 R >> endobj 18 0 obj << /chapter [/H1 11 0 R] /section [/H2 11 0 R] /subsection [/H3 11 0 R] /subsubsection [/H4 11 0 R] /paragraph [/H5 11 0 R] /subparagraph [/H6 11 0 R] >> endobj 17 0 obj -<< /Type /Namespace /NS (https://www.latex-project.org/ns/book/2022) /RoleMapNS 18 0 R >> +<< /Type /Namespace /NS (https://www.latex-project.org/ns/book) /RoleMapNS 18 0 R >> endobj 19 0 obj << /Type /Namespace /NS (data:,C9B55C18-275C-494E-C10F-E4B83CD03F23) >> @@ -1050,7 +1050,7 @@ endobj [ 9 0 R 11 0 R 13 0 R 15 0 R 17 0 R 19 0 R ] endobj 21 0 obj -<< /Type /StructElem /S /Document /NS 11 0 R /P 5 0 R /K [34 0 R 36 0 R 95 0 R 123 0 R 143 0 R 201 0 R] /ID (ID.0002) >> +<< /Type /StructElem /S /Document /NS 11 0 R /P 5 0 R /K [34 0 R 36 0 R 95 0 R 123 0 R 143 0 R 193 0 R] /ID (ID.0002) >> endobj 32 0 obj << /Type /StructElem /S /Artifact /NS 15 0 R /P 5 0 R /ID (ID.0003) >> @@ -1062,88 +1062,88 @@ endobj << /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 35 0 R /ID (ID.0005) >> endobj 35 0 obj -<< /Type /StructElem /C /justify /S /text /NS 15 0 R /P 34 0 R /K <> /ID (ID.0006) >> +<< /Type /StructElem /C /justify /S /text /NS 15 0 R /P 34 0 R /K <> /ID (ID.0006) >> endobj 36 0 obj << /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 37 0 R /ID (ID.0007) >> endobj 37 0 obj -<< /Type /StructElem /C /display /AF [23 0 R 39 0 R] /T /S /Formula /NS 11 0 R /P 36 0 R /K [<> <> <> 71 0 R] /ID (ID.0008) >> +<< /Type /StructElem /C /display /AF [23 0 R 39 0 R] /T /S /Formula /NS 11 0 R /P 36 0 R /K [<> <> <> 71 0 R] /ID (ID.0008) >> endobj 40 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 81 0 R /K 41 0 R /ID (ID.0009) >> endobj 41 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 40 0 R /K <> /ID (ID.0010) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 40 0 R /K <> /ID (ID.0010) >> endobj 42 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 81 0 R /K 43 0 R /ID (ID.0011) >> endobj 43 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 42 0 R /K <> /ID (ID.0012) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 42 0 R /K <> /ID (ID.0012) >> endobj 44 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 81 0 R /K 45 0 R /ID (ID.0013) >> endobj 45 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 44 0 R /K <> /ID (ID.0014) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 44 0 R /K <> /ID (ID.0014) >> endobj 46 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 82 0 R /K 47 0 R /ID (ID.0015) >> endobj 47 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 46 0 R /K <> /ID (ID.0016) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 46 0 R /K <> /ID (ID.0016) >> endobj 48 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 82 0 R /K 49 0 R /ID (ID.0017) >> endobj 49 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 48 0 R /K <> /ID (ID.0018) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 48 0 R /K <> /ID (ID.0018) >> endobj 50 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 82 0 R /K 51 0 R /ID (ID.0019) >> endobj 51 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 50 0 R /K <> /ID (ID.0020) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 50 0 R /K <> /ID (ID.0020) >> endobj 52 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 83 0 R /K 53 0 R /ID (ID.0021) >> endobj 53 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 52 0 R /K <> /ID (ID.0022) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 52 0 R /K <> /ID (ID.0022) >> endobj 54 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 83 0 R /K 55 0 R /ID (ID.0023) >> endobj 55 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 54 0 R /K <> /ID (ID.0024) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 54 0 R /K <> /ID (ID.0024) >> endobj 56 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 83 0 R /K 57 0 R /ID (ID.0025) >> endobj 57 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 56 0 R /K <> /ID (ID.0026) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 56 0 R /K <> /ID (ID.0026) >> endobj 58 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 59 0 R /ID (ID.0027) >> endobj 59 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 58 0 R /K <> /ID (ID.0028) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 58 0 R /K <> /ID (ID.0028) >> endobj 60 0 obj -<< /Type /StructElem /S /mtext /NS 13 0 R /P 66 0 R /K [<> 61 0 R] /ID (ID.0029) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 66 0 R /K [<> 61 0 R] /ID (ID.0029) >> endobj 61 0 obj << /Type /StructElem /S /math /NS 13 0 R /P 60 0 R /K [62 0 R 63 0 R 65 0 R] /ID (ID.0030) >> endobj 62 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 61 0 R /K <> /ID (ID.0031) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 61 0 R /K <> /ID (ID.0031) >> endobj 63 0 obj -<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 61 0 R /K <> /ID (ID.0032) >> +<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 61 0 R /K <> /ID (ID.0032) >> endobj 65 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 61 0 R /K <> /ID (ID.0033) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 61 0 R /K <> /ID (ID.0033) >> endobj 66 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 91 0 R /K 60 0 R /ID (ID.0034) >> @@ -1152,10 +1152,10 @@ endobj << /Type /StructElem /S /mtd /NS 13 0 R /P 92 0 R /K 68 0 R /ID (ID.0035) >> endobj 68 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 67 0 R /K <> /ID (ID.0036) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 67 0 R /K <> /ID (ID.0036) >> endobj 69 0 obj -<< /Type /StructElem /S /mtext /NS 13 0 R /P 70 0 R /K <> /ID (ID.0037) >> +<< /Type /StructElem /S /mtext /NS 13 0 R /P 70 0 R /K <> /ID (ID.0037) >> endobj 70 0 obj << /Type /StructElem /S /mtd /NS 13 0 R /P 92 0 R /K 69 0 R /ID (ID.0038) >> @@ -1167,7 +1167,7 @@ endobj << /Type /StructElem /S /mrow /NS 13 0 R /P 71 0 R /K [74 0 R 76 0 R 78 0 R 84 0 R 85 0 R] /ID (ID.0040) >> endobj 74 0 obj -<< /Type /StructElem /A 75 0 R /S /mo /NS 13 0 R /P 73 0 R /K <> /ID (ID.0041) >> +<< /Type /StructElem /A 75 0 R /S /mo /NS 13 0 R /P 73 0 R /K <> /ID (ID.0041) >> endobj 76 0 obj << /Type /StructElem /A 77 0 R /S /mspace /NS 13 0 R /P 73 0 R /ID (ID.0042) >> @@ -1191,16 +1191,16 @@ endobj << /Type /StructElem /A 77 0 R /S /mspace /NS 13 0 R /P 73 0 R /ID (ID.0048) >> endobj 85 0 obj -<< /Type /StructElem /A 75 0 R /S /mo /NS 13 0 R /P 73 0 R /K <> /ID (ID.0049) >> +<< /Type /StructElem /A 75 0 R /S /mo /NS 13 0 R /P 73 0 R /K <> /ID (ID.0049) >> endobj 86 0 obj -<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 71 0 R /K <> /ID (ID.0050) >> +<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 71 0 R /K <> /ID (ID.0050) >> endobj 87 0 obj << /Type /StructElem /S /mrow /NS 13 0 R /P 71 0 R /K [88 0 R 89 0 R 93 0 R] /ID (ID.0051) >> endobj 88 0 obj -<< /Type /StructElem /A 75 0 R /S /mo /NS 13 0 R /P 87 0 R /K <> /ID (ID.0052) >> +<< /Type /StructElem /A 75 0 R /S /mo /NS 13 0 R /P 87 0 R /K <> /ID (ID.0052) >> endobj 89 0 obj << /Type /StructElem /A 79 0 R /S /mpadded /NS 13 0 R /P 87 0 R /K 90 0 R /ID (ID.0053) >> @@ -1221,16 +1221,16 @@ endobj << /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 96 0 R /ID (ID.0058) >> endobj 96 0 obj -<< /Type /StructElem /C /display /AF [25 0 R 98 0 R] /T /S /Formula /NS 11 0 R /P 95 0 R /K [<> <> 99 0 R] /ID (ID.0059) >> +<< /Type /StructElem /C /display /AF [25 0 R 98 0 R] /T /S /Formula /NS 11 0 R /P 95 0 R /K [<> <> 99 0 R] /ID (ID.0059) >> endobj 99 0 obj << /Type /StructElem /A 72 0 R /S /math /NS 13 0 R /P 96 0 R /K [100 0 R 101 0 R 102 0 R 121 0 R] /ID (ID.0060) >> endobj 100 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 99 0 R /K <> /ID (ID.0061) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 99 0 R /K <> /ID (ID.0061) >> endobj 101 0 obj -<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 99 0 R /K <> /ID (ID.0062) >> +<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 99 0 R /K <> /ID (ID.0062) >> endobj 102 0 obj << /Type /StructElem /S /mfrac /NS 13 0 R /P 99 0 R /K [103 0 R 118 0 R] /ID (ID.0063) >> @@ -1239,13 +1239,13 @@ endobj << /Type /StructElem /S /mrow /NS 13 0 R /P 102 0 R /K [104 0 R 106 0 R 107 0 R 109 0 R] /ID (ID.0064) >> endobj 104 0 obj -<< /Type /StructElem /A 105 0 R /S /mo /NS 13 0 R /P 103 0 R /K <> /ID (ID.0065) >> +<< /Type /StructElem /A 105 0 R /S /mo /NS 13 0 R /P 103 0 R /K <> /ID (ID.0065) >> endobj 106 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 103 0 R /K <> /ID (ID.0066) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 103 0 R /K <> /ID (ID.0066) >> endobj 107 0 obj -<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 103 0 R /K <> /ID (ID.0067) >> +<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 103 0 R /K <> /ID (ID.0067) >> endobj 109 0 obj << /Type /StructElem /S /msqrt /NS 13 0 R /P 103 0 R /K 110 0 R /ID (ID.0068) >> @@ -1257,40 +1257,40 @@ endobj << /Type /StructElem /S /msup /NS 13 0 R /P 110 0 R /K [112 0 R 113 0 R] /ID (ID.0070) >> endobj 112 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 111 0 R /K <> /ID (ID.0071) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 111 0 R /K <> /ID (ID.0071) >> endobj 113 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 111 0 R /K <> /ID (ID.0072) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 111 0 R /K <> /ID (ID.0072) >> endobj 114 0 obj -<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 110 0 R /K <> /ID (ID.0073) >> +<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 110 0 R /K <> /ID (ID.0073) >> endobj 115 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 110 0 R /K <> /ID (ID.0074) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 110 0 R /K <> /ID (ID.0074) >> endobj 116 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 110 0 R /K <> /ID (ID.0075) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 110 0 R /K <> /ID (ID.0075) >> endobj 117 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 110 0 R /K <> /ID (ID.0076) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 110 0 R /K <> /ID (ID.0076) >> endobj 118 0 obj << /Type /StructElem /S /mrow /NS 13 0 R /P 102 0 R /K [119 0 R 120 0 R] /ID (ID.0077) >> endobj 119 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 118 0 R /K <> /ID (ID.0078) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 118 0 R /K <> /ID (ID.0078) >> endobj 120 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 118 0 R /K <> /ID (ID.0079) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 118 0 R /K <> /ID (ID.0079) >> endobj 121 0 obj -<< /Type /StructElem /A 122 0 R /S /mo /NS 13 0 R /P 99 0 R /K <> /ID (ID.0080) >> +<< /Type /StructElem /A 122 0 R /S /mo /NS 13 0 R /P 99 0 R /K <> /ID (ID.0080) >> endobj 123 0 obj << /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 124 0 R /ID (ID.0081) >> endobj 124 0 obj -<< /Type /StructElem /C /display /AF [27 0 R 126 0 R] /T /S /Formula /NS 11 0 R /P 123 0 R /K [<> 127 0 R] /ID (ID.0082) >> +<< /Type /StructElem /C /display /AF [27 0 R 126 0 R] /T /S /Formula /NS 11 0 R /P 123 0 R /K [<> 127 0 R] /ID (ID.0082) >> endobj 127 0 obj << /Type /StructElem /A 72 0 R /S /math /NS 13 0 R /P 124 0 R /K [128 0 R 132 0 R 135 0 R 139 0 R] /ID (ID.0083) >> @@ -1299,16 +1299,16 @@ endobj << /Type /StructElem /S /munder /NS 13 0 R /P 127 0 R /K [129 0 R 131 0 R] /ID (ID.0084) >> endobj 129 0 obj -<< /Type /StructElem /A 130 0 R /S /mo /NS 13 0 R /P 128 0 R /K <> /ID (ID.0085) >> +<< /Type /StructElem /A 130 0 R /S /mo /NS 13 0 R /P 128 0 R /K <> /ID (ID.0085) >> endobj 131 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 128 0 R /K <> /ID (ID.0086) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 128 0 R /K <> /ID (ID.0086) >> endobj 132 0 obj << /Type /StructElem /S /munder /NS 13 0 R /P 127 0 R /K [133 0 R 134 0 R] /ID (ID.0087) >> endobj 133 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 132 0 R /K <> /ID (ID.0088) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 132 0 R /K <> /ID (ID.0088) >> endobj 134 0 obj << /Type /StructElem /S /mo /NS 13 0 R /P 132 0 R /ID (ID.0089) >> @@ -1317,247 +1317,223 @@ endobj << /Type /StructElem /S /mover /NS 13 0 R /P 127 0 R /K [136 0 R 137 0 R] /ID (ID.0090) >> endobj 136 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 135 0 R /K <> /ID (ID.0091) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 135 0 R /K <> /ID (ID.0091) >> endobj 137 0 obj -<< /Type /StructElem /A 138 0 R /S /mo /NS 13 0 R /P 135 0 R /K <> /ID (ID.0092) >> +<< /Type /StructElem /A 138 0 R /S /mo /NS 13 0 R /P 135 0 R /K <> /ID (ID.0092) >> endobj 139 0 obj << /Type /StructElem /S /msup /NS 13 0 R /P 127 0 R /K [140 0 R 141 0 R] /ID (ID.0093) >> endobj 140 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 139 0 R /K <> /ID (ID.0094) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 139 0 R /K <> /ID (ID.0094) >> endobj 141 0 obj -<< /Type /StructElem /A 142 0 R /S /mi /NS 13 0 R /P 139 0 R /K <> /ID (ID.0095) >> +<< /Type /StructElem /A 142 0 R /S /mi /NS 13 0 R /P 139 0 R /K <> /ID (ID.0095) >> endobj 143 0 obj << /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 144 0 R /ID (ID.0096) >> endobj 144 0 obj -<< /Type /StructElem /C /display /AF [29 0 R 146 0 R] /T /S /Formula /NS 11 0 R /P 143 0 R /K [<> 169 0 R <> 185 0 R <> 194 0 R 195 0 R] /ID (ID.0097) >> +<< /Type /StructElem /C /display /AF [29 0 R 146 0 R] /T /S /Formula /NS 11 0 R /P 143 0 R /K [<> 167 0 R <> 180 0 R <> 186 0 R 187 0 R] /ID (ID.0097) >> endobj 147 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 198 0 R /K [148 0 R 149 0 R 150 0 R] /ID (ID.0098) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 190 0 R /K [148 0 R 149 0 R 150 0 R] /ID (ID.0098) >> endobj 148 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 147 0 R /K <> /ID (ID.0099) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 147 0 R /K <> /ID (ID.0099) >> endobj 149 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 147 0 R /K <> /ID (ID.0100) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 147 0 R /K <> /ID (ID.0100) >> endobj 150 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 147 0 R /K <> /ID (ID.0101) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 147 0 R /K <> /ID (ID.0101) >> endobj 151 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 198 0 R /K [152 0 R 153 0 R 154 0 R 155 0 R 156 0 R] /ID (ID.0102) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 190 0 R /K [152 0 R 153 0 R 154 0 R 155 0 R] /ID (ID.0102) >> endobj 152 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 151 0 R /ID (ID.0103) >> +<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 151 0 R /K <> /ID (ID.0103) >> endobj 153 0 obj -<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 151 0 R /K <> /ID (ID.0104) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 151 0 R /K <> /ID (ID.0104) >> endobj 154 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 151 0 R /K <> /ID (ID.0105) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 151 0 R /K <> /ID (ID.0105) >> endobj 155 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 151 0 R /K <> /ID (ID.0106) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 151 0 R /K <> /ID (ID.0106) >> endobj 156 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 151 0 R /K <> /ID (ID.0107) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 190 0 R /K 157 0 R /ID (ID.0107) >> endobj 157 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 198 0 R /K 158 0 R /ID (ID.0108) >> +<< /Type /StructElem /S /msup /NS 13 0 R /P 156 0 R /K [158 0 R 159 0 R] /ID (ID.0108) >> endobj 158 0 obj -<< /Type /StructElem /S /msup /NS 13 0 R /P 157 0 R /K [159 0 R 160 0 R] /ID (ID.0109) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 157 0 R /K <> /ID (ID.0109) >> endobj 159 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 158 0 R /K <> /ID (ID.0110) >> +<< /Type /StructElem /S /mrow /NS 13 0 R /P 157 0 R /K [160 0 R 161 0 R] /ID (ID.0110) >> endobj 160 0 obj -<< /Type /StructElem /S /mrow /NS 13 0 R /P 158 0 R /K [161 0 R 162 0 R] /ID (ID.0111) >> +<< /Type /StructElem /A 142 0 R /S /mi /NS 13 0 R /P 159 0 R /K <> /ID (ID.0111) >> endobj 161 0 obj -<< /Type /StructElem /A 142 0 R /S /mi /NS 13 0 R /P 160 0 R /K <> /ID (ID.0112) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 159 0 R /K <> /ID (ID.0112) >> endobj 162 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 160 0 R /K <> /ID (ID.0113) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 190 0 R /K [163 0 R 165 0 R 166 0 R] /ID (ID.0113) >> endobj 163 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 198 0 R /K [164 0 R 165 0 R 167 0 R 168 0 R] /ID (ID.0114) >> -endobj -164 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 163 0 R /ID (ID.0115) >> +<< /Type /StructElem /A 164 0 R /S /mo /NS 13 0 R /P 162 0 R /K <> /ID (ID.0114) >> endobj 165 0 obj -<< /Type /StructElem /A 166 0 R /S /mo /NS 13 0 R /P 163 0 R /K <> /ID (ID.0116) >> +<< /Type /StructElem /A 164 0 R /S /mo /NS 13 0 R /P 162 0 R /K <> /ID (ID.0115) >> +endobj +166 0 obj +<< /Type /StructElem /S /mn /NS 13 0 R /P 162 0 R /K <> /ID (ID.0116) >> endobj 167 0 obj -<< /Type /StructElem /A 166 0 R /S /mo /NS 13 0 R /P 163 0 R /K <> /ID (ID.0117) >> +<< /Type /StructElem /S /Lbl /NS 11 0 R /P 144 0 R /K <> /ID (ID.0117) >> endobj 168 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 163 0 R /K <> /ID (ID.0118) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 191 0 R /K [169 0 R 171 0 R 172 0 R 173 0 R] /ID (ID.0118) >> endobj 169 0 obj -<< /Type /StructElem /S /Lbl /NS 11 0 R /P 144 0 R /K <> /ID (ID.0119) >> -endobj -170 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 199 0 R /K [171 0 R 173 0 R 174 0 R 175 0 R] /ID (ID.0120) >> +<< /Type /StructElem /A 170 0 R /S /mo /NS 13 0 R /P 168 0 R /K <> /ID (ID.0119) >> endobj 171 0 obj -<< /Type /StructElem /A 172 0 R /S /mo /NS 13 0 R /P 170 0 R /K <> /ID (ID.0121) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 168 0 R /K <> /ID (ID.0120) >> +endobj +172 0 obj +<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 168 0 R /K <> /ID (ID.0121) >> endobj 173 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 170 0 R /K <> /ID (ID.0122) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 168 0 R /K <> /ID (ID.0122) >> endobj 174 0 obj -<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 170 0 R /K <> /ID (ID.0123) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 191 0 R /K [175 0 R 176 0 R 177 0 R] /ID (ID.0123) >> endobj 175 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 170 0 R /K <> /ID (ID.0124) >> +<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 174 0 R /K <> /ID (ID.0124) >> endobj 176 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 199 0 R /K [177 0 R 178 0 R 179 0 R 180 0 R] /ID (ID.0125) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 174 0 R /K <> /ID (ID.0125) >> endobj 177 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 176 0 R /ID (ID.0126) >> +<< /Type /StructElem /A 170 0 R /S /mo /NS 13 0 R /P 174 0 R /K <> /ID (ID.0126) >> endobj 178 0 obj -<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 176 0 R /K <> /ID (ID.0127) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 191 0 R /ID (ID.0127) >> endobj 179 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 176 0 R /K <> /ID (ID.0128) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 191 0 R /ID (ID.0128) >> endobj 180 0 obj -<< /Type /StructElem /A 172 0 R /S /mo /NS 13 0 R /P 176 0 R /K <> /ID (ID.0129) >> +<< /Type /StructElem /S /Lbl /NS 11 0 R /P 144 0 R /K <> /ID (ID.0129) >> endobj 181 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 199 0 R /K 182 0 R /ID (ID.0130) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 192 0 R /K 182 0 R /ID (ID.0130) >> endobj 182 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 181 0 R /ID (ID.0131) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 181 0 R /K <> /ID (ID.0131) >> endobj 183 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 199 0 R /K 184 0 R /ID (ID.0132) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 192 0 R /ID (ID.0132) >> endobj 184 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 183 0 R /ID (ID.0133) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 192 0 R /ID (ID.0133) >> endobj 185 0 obj -<< /Type /StructElem /S /Lbl /NS 11 0 R /P 144 0 R /K <> /ID (ID.0134) >> +<< /Type /StructElem /S /mtd /NS 13 0 R /P 192 0 R /ID (ID.0134) >> endobj 186 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 187 0 R /ID (ID.0135) >> +<< /Type /StructElem /S /Lbl /NS 11 0 R /P 144 0 R /K <> /ID (ID.0135) >> endobj 187 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 186 0 R /K <> /ID (ID.0136) >> +<< /Type /StructElem /A 72 0 R /S /math /NS 13 0 R /P 144 0 R /K 188 0 R /ID (ID.0136) >> endobj 188 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 189 0 R /ID (ID.0137) >> -endobj -189 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 188 0 R /ID (ID.0138) >> +<< /Type /StructElem /A 189 0 R /S /mtable /NS 13 0 R /P 187 0 R /K [190 0 R 191 0 R 192 0 R] /ID (ID.0137) >> endobj 190 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 191 0 R /ID (ID.0139) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 188 0 R /K [147 0 R 151 0 R 156 0 R 162 0 R] /ID (ID.0138) >> endobj 191 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 190 0 R /ID (ID.0140) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 188 0 R /K [168 0 R 174 0 R 178 0 R 179 0 R] /ID (ID.0139) >> endobj 192 0 obj -<< /Type /StructElem /S /mtd /NS 13 0 R /P 200 0 R /K 193 0 R /ID (ID.0141) >> +<< /Type /StructElem /S /mtr /NS 13 0 R /P 188 0 R /K [181 0 R 183 0 R 184 0 R 185 0 R] /ID (ID.0140) >> endobj 193 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 192 0 R /ID (ID.0142) >> +<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 194 0 R /ID (ID.0141) >> endobj 194 0 obj -<< /Type /StructElem /S /Lbl /NS 11 0 R /P 144 0 R /K <> /ID (ID.0143) >> +<< /Type /StructElem /C /justify /S /text /NS 15 0 R /P 193 0 R /K [<> 195 0 R <> ] /ID (ID.0142) >> endobj 195 0 obj -<< /Type /StructElem /A 72 0 R /S /math /NS 13 0 R /P 144 0 R /K 196 0 R /ID (ID.0144) >> -endobj -196 0 obj -<< /Type /StructElem /A 197 0 R /S /mtable /NS 13 0 R /P 195 0 R /K [198 0 R 199 0 R 200 0 R] /ID (ID.0145) >> +<< /Type /StructElem /C /inline /AF [31 0 R 197 0 R] /T /S /Formula /NS 11 0 R /P 194 0 R /K [<> 198 0 R] /ID (ID.0143) >> endobj 198 0 obj -<< /Type /StructElem /S /mtr /NS 13 0 R /P 196 0 R /K [147 0 R 151 0 R 157 0 R 163 0 R] /ID (ID.0146) >> +<< /Type /StructElem /S /math /NS 13 0 R /P 195 0 R /K [199 0 R 200 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R] /ID (ID.0144) >> endobj 199 0 obj -<< /Type /StructElem /S /mtr /NS 13 0 R /P 196 0 R /K [170 0 R 176 0 R 181 0 R 183 0 R] /ID (ID.0147) >> +<< /Type /StructElem /A 142 0 R /S /mi /NS 13 0 R /P 198 0 R /K <> /ID (ID.0145) >> endobj 200 0 obj -<< /Type /StructElem /S /mtr /NS 13 0 R /P 196 0 R /K [186 0 R 188 0 R 190 0 R 192 0 R] /ID (ID.0148) >> -endobj -201 0 obj -<< /Type /StructElem /S /text-unit /NS 15 0 R /P 21 0 R /K 202 0 R /ID (ID.0149) >> +<< /Type /StructElem /A 201 0 R /S /mo /NS 13 0 R /P 198 0 R /K <> /ID (ID.0146) >> endobj 202 0 obj -<< /Type /StructElem /C /justify /S /text /NS 15 0 R /P 201 0 R /K [<> 203 0 R <> ] /ID (ID.0150) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 198 0 R /K <> /ID (ID.0147) >> endobj 203 0 obj -<< /Type /StructElem /C /inline /AF [31 0 R 205 0 R] /T /S /Formula /NS 11 0 R /P 202 0 R /K [<> 206 0 R] /ID (ID.0151) >> +<< /Type /StructElem /A 201 0 R /S /mo /NS 13 0 R /P 198 0 R /K <> /ID (ID.0148) >> +endobj +204 0 obj +<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 198 0 R /K <> /ID (ID.0149) >> +endobj +205 0 obj +<< /Type /StructElem /A 142 0 R /S /mi /NS 13 0 R /P 198 0 R /K <> /ID (ID.0150) >> endobj 206 0 obj -<< /Type /StructElem /S /math /NS 13 0 R /P 203 0 R /K [207 0 R 208 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R] /ID (ID.0152) >> +<< /Type /StructElem /A 201 0 R /S /mo /NS 13 0 R /P 198 0 R /K <> /ID (ID.0151) >> endobj 207 0 obj -<< /Type /StructElem /A 142 0 R /S /mi /NS 13 0 R /P 206 0 R /K <> /ID (ID.0153) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 198 0 R /K <> /ID (ID.0152) >> endobj 208 0 obj -<< /Type /StructElem /A 209 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0154) >> +<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 198 0 R /K <> /ID (ID.0153) >> +endobj +209 0 obj +<< /Type /StructElem /S /mn /NS 13 0 R /P 198 0 R /K <> /ID (ID.0154) >> endobj 210 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 206 0 R /K <> /ID (ID.0155) >> +<< /Type /StructElem /S /mi /NS 13 0 R /P 198 0 R /K <> /ID (ID.0155) >> endobj 211 0 obj -<< /Type /StructElem /A 209 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0156) >> +<< /Type /StructElem /A 201 0 R /S /mo /NS 13 0 R /P 198 0 R /K <> /ID (ID.0156) >> endobj 212 0 obj -<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0157) >> +<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 198 0 R /K <> /ID (ID.0157) >> endobj 213 0 obj -<< /Type /StructElem /A 142 0 R /S /mi /NS 13 0 R /P 206 0 R /K <> /ID (ID.0158) >> -endobj -214 0 obj -<< /Type /StructElem /A 209 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0159) >> -endobj -215 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 206 0 R /K <> /ID (ID.0160) >> -endobj -216 0 obj -<< /Type /StructElem /A 108 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0161) >> -endobj -217 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 206 0 R /K <> /ID (ID.0162) >> -endobj -218 0 obj -<< /Type /StructElem /S /mi /NS 13 0 R /P 206 0 R /K <> /ID (ID.0163) >> -endobj -219 0 obj -<< /Type /StructElem /A 209 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0164) >> -endobj -220 0 obj -<< /Type /StructElem /A 64 0 R /S /mo /NS 13 0 R /P 206 0 R /K <> /ID (ID.0165) >> -endobj -221 0 obj -<< /Type /StructElem /S /mn /NS 13 0 R /P 206 0 R /K <> /ID (ID.0166) >> +<< /Type /StructElem /S /mn /NS 13 0 R /P 198 0 R /K <> /ID (ID.0158) >> endobj 5 0 obj -<< /Type /StructTreeRoot /Namespaces 8 0 R /IDTree 237 0 R /ClassMap 238 0 R /ParentTree 6 0 R /RoleMap 7 0 R /K 21 0 R >> +<< /Type /StructTreeRoot /Namespaces 8 0 R /IDTree 229 0 R /ClassMap 230 0 R /ParentTree 6 0 R /RoleMap 7 0 R /K 21 0 R >> endobj -239 0 obj +231 0 obj [ 66 [ 323 ] ] endobj -241 0 obj +233 0 obj << /Subtype /CIDFontType0C /Length 592 >> [BINARY STREAM] endobj -240 0 obj -<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 241 0 R >> +232 0 obj +<< /Type /FontDescriptor /FontName /QTQISS+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 233 0 R >> endobj -242 0 obj +234 0 obj << /Length 687 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1593,23 +1569,23 @@ end %%EOF endstream endobj -229 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 243 0 R ] /ToUnicode 242 0 R >> +221 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QTQISS+LMRoman7-Regular /DescendantFonts [ 235 0 R ] /ToUnicode 234 0 R >> endobj -243 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 240 0 R /W 239 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +235 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QTQISS+LMRoman7-Regular /FontDescriptor 232 0 R /W 231 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -244 0 obj +236 0 obj [ 1013 [ 569 ] 1404 [ 620 ] 2981 [ 407 ] 4558 [ 668 ] ] endobj -246 0 obj +238 0 obj << /Subtype /CIDFontType0C /Length 1102 >> [BINARY STREAM] endobj -245 0 obj -<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 246 0 R >> +237 0 obj +<< /Type /FontDescriptor /FontName /ZIIHRW+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 113 /XHeight 431 /FontFile3 238 0 R >> endobj -247 0 obj +239 0 obj << /Length 772 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1648,23 +1624,23 @@ end %%EOF endstream endobj -228 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 248 0 R ] /ToUnicode 247 0 R >> +220 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZIIHRW+LatinModernMath-Regular /DescendantFonts [ 240 0 R ] /ToUnicode 239 0 R >> endobj -248 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 245 0 R /W 244 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +240 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZIIHRW+LatinModernMath-Regular /FontDescriptor 237 0 R /W 236 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -249 0 obj +241 0 obj [ 9 [ 389 389 ] 12 [ 778 ] 15 [ 278 ] 17 [ 500 500 500 500 500 500 ] 30 [ 778 ] 1296 [ 529 429 433 520 466 490 ] 1319 [ 572 ] 1790 [ 0 ] 2455 [ 663 663 ] 2503 [ 875 875 875 875 875 875 ] 2515 [ 902 ] 2615 [ 778 ] 2619 [ 778 ] 3074 [ 1444 ] 3077 [ 833 ] 4474 [ 570 ] ] endobj -251 0 obj +243 0 obj << /Subtype /CIDFontType0C /Length 4088 >> [BINARY STREAM] endobj -250 0 obj -<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 251 0 R >> +242 0 obj +<< /Type /FontDescriptor /FontName /RHJXIX+LatinModernMath-Regular /Flags 4 /FontBBox [ -1042 -3060 4082 3560 ] /Ascent 806 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 243 0 R >> endobj -252 0 obj +244 0 obj << /Length 1203 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1732,23 +1708,23 @@ end %%EOF endstream endobj -227 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 253 0 R ] /ToUnicode 252 0 R >> +219 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RHJXIX+LatinModernMath-Regular /DescendantFonts [ 245 0 R ] /ToUnicode 244 0 R >> endobj -253 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 250 0 R /W 249 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +245 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RHJXIX+LatinModernMath-Regular /FontDescriptor 242 0 R /W 241 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -254 0 obj +246 0 obj [ 49 [ 681 444 ] 55 [ 306 ] 59 [ 500 ] 63 [ 556 ] 66 [ 278 ] 72 [ 278 ] 77 [ 556 ] 81 [ 500 500 ] 85 [ 389 389 ] 88 [ 278 ] 98 [ 394 ] 103 [ 333 ] 105 [ 389 500 500 ] ] endobj -256 0 obj +248 0 obj << /Subtype /CIDFontType0C /Length 2411 >> [BINARY STREAM] endobj -255 0 obj -<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 256 0 R >> +247 0 obj +<< /Type /FontDescriptor /FontName /RYKTJL+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 248 0 R >> endobj -257 0 obj +249 0 obj << /Length 931 >> stream %!PS-Adobe-3.0 Resource-CMap @@ -1801,48 +1777,48 @@ end %%EOF endstream endobj -226 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 258 0 R ] /ToUnicode 257 0 R >> +218 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RYKTJL+LMRoman10-Regular /DescendantFonts [ 250 0 R ] /ToUnicode 249 0 R >> endobj -258 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 255 0 R /W 254 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +250 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RYKTJL+LMRoman10-Regular /FontDescriptor 247 0 R /W 246 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -230 0 obj -<< /Type /Pages /Count 1 /Kids [ 224 0 R ] >> +222 0 obj +<< /Type /Pages /Count 1 /Kids [ 216 0 R ] >> endobj -259 0 obj -<< /EmbeddedFiles 232 0 R >> +251 0 obj +<< /EmbeddedFiles 224 0 R >> endobj -260 0 obj -<< /Type /Catalog /Pages 230 0 R /Names 259 0 R /MarkInfo 231 0 R/Lang (en)/Metadata 222 0 R/StructTreeRoot 5 0 R >> +252 0 obj +<< /Type /Catalog /Pages 222 0 R /Names 251 0 R /MarkInfo 223 0 R/Lang (en)/Metadata 214 0 R/StructTreeRoot 5 0 R >> endobj -261 0 obj +253 0 obj << /Producer (LuaTeX)/Creator (TeX)/CreationDate (D:20160520090000Z)/ModDate (D:20160520090000Z) /Trapped /False >> endobj xref -0 262 +0 254 0000000002 65535 f -0000028118 00000 n +0000028070 00000 n 0000000003 00000 f 0000000004 00000 f 0000000010 00000 f -0000054832 00000 n -0000028323 00000 n -0000032291 00000 n -0000034486 00000 n -0000033111 00000 n +0000053863 00000 n +0000028275 00000 n +0000032099 00000 n +0000034284 00000 n +0000032919 00000 n 0000000012 00000 f -0000033179 00000 n +0000032987 00000 n 0000000014 00000 f -0000033249 00000 n +0000033057 00000 n 0000000020 00000 f -0000034012 00000 n -0000033330 00000 n -0000034290 00000 n -0000034119 00000 n -0000034397 00000 n +0000033820 00000 n +0000033138 00000 n +0000034093 00000 n +0000033922 00000 n +0000034195 00000 n 0000000000 00000 f -0000034547 00000 n +0000034345 00000 n 0000000020 00000 n 0000000299 00000 n 0000000486 00000 n @@ -1850,241 +1826,233 @@ xref 0000001318 00000 n 0000001800 00000 n 0000001987 00000 n -0000003198 00000 n -0000003385 00000 n -0000004064 00000 n -0000034686 00000 n -0000034775 00000 n -0000034864 00000 n -0000034965 00000 n -0000035102 00000 n -0000035203 00000 n -0000004251 00000 n -0000004566 00000 n -0000035489 00000 n -0000035584 00000 n -0000035707 00000 n -0000035802 00000 n -0000035925 00000 n -0000036020 00000 n -0000036143 00000 n -0000036238 00000 n -0000036361 00000 n -0000036456 00000 n -0000036579 00000 n -0000036674 00000 n -0000036797 00000 n -0000036892 00000 n -0000037016 00000 n -0000037111 00000 n -0000037235 00000 n -0000037330 00000 n -0000037454 00000 n -0000037549 00000 n -0000037673 00000 n -0000037809 00000 n -0000037921 00000 n -0000038045 00000 n -0000004766 00000 n -0000038180 00000 n -0000038304 00000 n -0000038399 00000 n -0000038494 00000 n -0000038618 00000 n -0000038745 00000 n -0000038840 00000 n -0000004837 00000 n -0000038963 00000 n -0000039089 00000 n -0000004891 00000 n -0000039223 00000 n -0000004978 00000 n -0000039322 00000 n -0000005033 00000 n -0000039432 00000 n -0000039546 00000 n -0000039657 00000 n -0000039768 00000 n -0000039879 00000 n -0000039978 00000 n -0000040113 00000 n -0000040248 00000 n -0000040360 00000 n -0000040495 00000 n -0000040605 00000 n -0000040712 00000 n -0000040816 00000 n -0000040920 00000 n -0000005105 00000 n -0000041019 00000 n -0000041120 00000 n -0000005159 00000 n -0000005375 00000 n -0000041372 00000 n -0000041506 00000 n -0000041631 00000 n -0000041767 00000 n -0000041876 00000 n -0000042001 00000 n -0000005575 00000 n -0000042139 00000 n -0000042265 00000 n -0000005641 00000 n -0000042403 00000 n -0000042503 00000 n -0000042636 00000 n -0000042745 00000 n -0000042871 00000 n -0000042997 00000 n -0000043135 00000 n -0000043261 00000 n -0000043387 00000 n -0000043513 00000 n -0000043622 00000 n -0000043748 00000 n -0000043874 00000 n -0000005713 00000 n -0000044011 00000 n -0000044114 00000 n -0000005773 00000 n -0000005978 00000 n -0000044334 00000 n -0000044470 00000 n -0000044581 00000 n -0000006181 00000 n -0000044719 00000 n -0000044845 00000 n -0000044956 00000 n -0000045082 00000 n -0000045168 00000 n -0000045278 00000 n -0000045404 00000 n -0000006267 00000 n -0000045542 00000 n -0000045651 00000 n -0000045777 00000 n -0000006322 00000 n -0000045915 00000 n -0000046018 00000 n -0000006382 00000 n -0000006611 00000 n -0000046321 00000 n -0000046437 00000 n -0000046563 00000 n -0000046689 00000 n -0000046815 00000 n -0000046947 00000 n -0000047033 00000 n -0000047170 00000 n -0000047296 00000 n -0000047422 00000 n -0000047548 00000 n -0000047646 00000 n -0000047755 00000 n -0000047881 00000 n -0000047990 00000 n -0000048128 00000 n -0000048254 00000 n -0000048378 00000 n -0000048464 00000 n -0000006814 00000 n -0000048602 00000 n -0000048740 00000 n -0000048866 00000 n -0000048993 00000 n -0000049117 00000 n -0000006880 00000 n +0000003150 00000 n +0000003337 00000 n +0000004016 00000 n +0000034484 00000 n +0000034573 00000 n +0000034662 00000 n +0000034763 00000 n +0000034900 00000 n +0000035001 00000 n +0000004203 00000 n +0000004518 00000 n +0000035287 00000 n +0000035382 00000 n +0000035505 00000 n +0000035600 00000 n +0000035723 00000 n +0000035818 00000 n +0000035941 00000 n +0000036036 00000 n +0000036159 00000 n +0000036254 00000 n +0000036377 00000 n +0000036472 00000 n +0000036595 00000 n +0000036690 00000 n +0000036814 00000 n +0000036909 00000 n +0000037033 00000 n +0000037128 00000 n +0000037252 00000 n +0000037347 00000 n +0000037471 00000 n +0000037607 00000 n +0000037719 00000 n +0000037843 00000 n +0000004718 00000 n +0000037978 00000 n +0000038102 00000 n +0000038197 00000 n +0000038292 00000 n +0000038416 00000 n +0000038543 00000 n +0000038638 00000 n +0000004789 00000 n +0000038761 00000 n +0000038887 00000 n +0000004843 00000 n +0000039021 00000 n +0000004930 00000 n +0000039120 00000 n +0000004985 00000 n +0000039230 00000 n +0000039344 00000 n +0000039455 00000 n +0000039566 00000 n +0000039677 00000 n +0000039776 00000 n +0000039911 00000 n +0000040046 00000 n +0000040158 00000 n +0000040293 00000 n +0000040403 00000 n +0000040510 00000 n +0000040614 00000 n +0000040718 00000 n +0000005057 00000 n +0000040817 00000 n +0000040918 00000 n +0000005111 00000 n +0000005327 00000 n +0000041170 00000 n +0000041304 00000 n +0000041429 00000 n +0000041565 00000 n +0000041674 00000 n +0000041799 00000 n +0000005527 00000 n +0000041937 00000 n +0000042063 00000 n +0000005593 00000 n +0000042201 00000 n +0000042301 00000 n +0000042434 00000 n +0000042543 00000 n +0000042669 00000 n +0000042795 00000 n +0000042933 00000 n +0000043059 00000 n +0000043185 00000 n +0000043311 00000 n +0000043420 00000 n +0000043546 00000 n +0000043672 00000 n +0000005665 00000 n +0000043809 00000 n +0000043912 00000 n +0000005725 00000 n +0000005930 00000 n +0000044132 00000 n +0000044268 00000 n +0000044379 00000 n +0000006133 00000 n +0000044517 00000 n +0000044643 00000 n +0000044754 00000 n +0000044880 00000 n +0000044966 00000 n +0000045076 00000 n +0000045202 00000 n +0000006219 00000 n +0000045340 00000 n +0000045449 00000 n +0000045575 00000 n +0000006274 00000 n +0000045713 00000 n +0000045816 00000 n +0000006334 00000 n +0000006563 00000 n +0000046119 00000 n +0000046235 00000 n +0000046361 00000 n +0000046487 00000 n +0000046613 00000 n +0000046737 00000 n +0000046874 00000 n +0000047000 00000 n +0000047126 00000 n +0000047252 00000 n +0000047350 00000 n +0000047459 00000 n +0000047585 00000 n +0000047694 00000 n +0000047832 00000 n +0000047958 00000 n +0000048074 00000 n +0000006766 00000 n +0000048212 00000 n +0000048350 00000 n +0000048476 00000 n +0000048603 00000 n +0000048727 00000 n +0000006832 00000 n +0000048865 00000 n +0000048991 00000 n +0000049129 00000 n 0000049255 00000 n -0000049381 00000 n -0000049519 00000 n -0000049645 00000 n -0000049769 00000 n -0000049855 00000 n -0000049992 00000 n -0000050118 00000 n -0000050256 00000 n -0000050354 00000 n -0000050440 00000 n -0000050538 00000 n -0000050624 00000 n -0000050751 00000 n -0000050849 00000 n -0000050975 00000 n -0000051073 00000 n -0000051159 00000 n -0000051257 00000 n -0000051343 00000 n -0000051441 00000 n -0000051527 00000 n -0000051654 00000 n -0000051764 00000 n -0000007004 00000 n -0000051895 00000 n -0000052019 00000 n -0000052143 00000 n -0000052267 00000 n -0000052370 00000 n -0000052557 00000 n -0000007122 00000 n -0000007293 00000 n -0000052756 00000 n -0000052961 00000 n -0000053099 00000 n -0000007496 00000 n -0000053237 00000 n -0000053363 00000 n -0000053501 00000 n -0000053639 00000 n -0000053777 00000 n -0000053915 00000 n -0000054041 00000 n -0000054179 00000 n -0000054305 00000 n -0000054431 00000 n -0000054569 00000 n -0000054706 00000 n -0000007572 00000 n -0000028014 00000 n -0000027875 00000 n -0000019356 00000 n -0000069926 00000 n -0000065657 00000 n -0000059333 00000 n -0000056651 00000 n -0000070286 00000 n -0000028165 00000 n -0000028202 00000 n -0000029069 00000 n -0000029981 00000 n -0000030934 00000 n -0000031896 00000 n -0000032228 00000 n -0000032870 00000 n -0000054971 00000 n -0000055680 00000 n -0000055003 00000 n -0000055903 00000 n -0000056807 00000 n -0000057009 00000 n -0000058269 00000 n -0000057082 00000 n -0000058500 00000 n -0000059496 00000 n -0000059705 00000 n -0000064163 00000 n -0000059990 00000 n -0000064393 00000 n -0000065820 00000 n -0000066029 00000 n -0000068711 00000 n -0000066215 00000 n -0000068934 00000 n -0000070083 00000 n -0000070350 00000 n -0000070396 00000 n -0000070530 00000 n +0000049371 00000 n +0000049508 00000 n +0000049634 00000 n +0000049772 00000 n +0000049859 00000 n +0000049946 00000 n +0000050073 00000 n +0000050171 00000 n +0000050297 00000 n +0000050384 00000 n +0000050471 00000 n +0000050558 00000 n +0000050685 00000 n +0000050795 00000 n +0000006956 00000 n +0000050926 00000 n +0000051050 00000 n +0000051174 00000 n +0000051298 00000 n +0000051401 00000 n +0000051588 00000 n +0000007074 00000 n +0000007245 00000 n +0000051787 00000 n +0000051992 00000 n +0000052130 00000 n +0000007448 00000 n +0000052268 00000 n +0000052394 00000 n +0000052532 00000 n +0000052670 00000 n +0000052808 00000 n +0000052946 00000 n +0000053072 00000 n +0000053210 00000 n +0000053336 00000 n +0000053462 00000 n +0000053600 00000 n +0000053737 00000 n +0000007524 00000 n +0000027966 00000 n +0000027827 00000 n +0000019308 00000 n +0000068957 00000 n +0000064688 00000 n +0000058364 00000 n +0000055682 00000 n +0000069317 00000 n +0000028117 00000 n +0000028154 00000 n +0000029021 00000 n +0000029933 00000 n +0000030886 00000 n +0000031848 00000 n +0000032036 00000 n +0000032678 00000 n +0000054002 00000 n +0000054711 00000 n +0000054034 00000 n +0000054934 00000 n +0000055838 00000 n +0000056040 00000 n +0000057300 00000 n +0000056113 00000 n +0000057531 00000 n +0000058527 00000 n +0000058736 00000 n +0000063194 00000 n +0000059021 00000 n +0000063424 00000 n +0000064851 00000 n +0000065060 00000 n +0000067742 00000 n +0000065246 00000 n +0000067965 00000 n +0000069114 00000 n +0000069381 00000 n +0000069427 00000 n +0000069561 00000 n trailer -<< /Size 262 /Root 260 0 R /Info 261 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> +<< /Size 254 /Root 252 0 R /Info 253 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> startxref -70663 +69694 %%EOF diff --git a/testfiles-lua/test_structnum.tpf b/testfiles-lua/test_structnum.tpf index 6cd2230..57f1ccb 100644 --- a/testfiles-lua/test_structnum.tpf +++ b/testfiles-lua/test_structnum.tpf @@ -17,10 +17,10 @@ endobj << /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F (tag-AFfile1.tex) /UF /EF<> >> endobj 36 0 obj -<< /O/NSO/NS130R/lspace(0.278em)/rspace(0.278em) >> +<< /O/NSO/NS 13 0 R/lspace(0.278em)/rspace(0.278em) >> endobj 39 0 obj -<< /O/NSO/NS130R/width(9.963pt) >> +<< /O/NSO/NS 13 0 R/width(9.963pt) >> endobj 40 0 obj << /Type /Metadata /Subtype /XML /Length 16669 >> @@ -421,16 +421,16 @@ endobj [ 23 0 R ] endobj 50 0 obj -<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<> /Length 33 >> +<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<> /Length 115 >> stream -PDF standard A-4F requires a file +The document was declared to be of type PDF/A-4f but hasn't any attachments. LaTeX therefore added this dummy file. endstream endobj 51 0 obj -<< /Type /Filespec /AFRelationship /Unspecified /Desc (note about PDF/A-4F) /F (readme.txt) /UF /EF<> >> +<< /Type /Filespec /AFRelationship /Unspecified /Desc (note about PDF/A-4F) /F (pdf-A4f.txt) /UF /EF<> >> endobj 52 0 obj -<< /Names[(readme) 51 0 R] >> +<< /Names[(pdf-A4f) 51 0 R] >> endobj 6 0 obj << /Nums [0 [ 34 0 R 35 0 R 37 0 R 31 0 R 32 0 R] @@ -463,13 +463,13 @@ endobj << /title [/Title 11 0 R] /part [/Title 11 0 R] /section [/H1 11 0 R] /subsection [/H2 11 0 R] /subsubsection [/H3 11 0 R] /paragraph [/H4 11 0 R] /subparagraph [/H5 11 0 R] /list [/L 11 0 R] /itemize [/L 11 0 R] /enumerate [/L 11 0 R] /description [/L 11 0 R] /quote [/BlockQuote 9 0 R] /quotation [/BlockQuote 9 0 R] /verbatim [/P 11 0 R] /item [/LI 11 0 R] /itemlabel [/Lbl 11 0 R] /itembody [/LBody 11 0 R] /footnote [/FENote 11 0 R] /footnotemark [/Lbl 11 0 R] /footnotelabel [/Lbl 11 0 R] /text-unit [/Part 11 0 R] /text [/P 11 0 R] /theorem-like [/Sect 11 0 R] /codeline [/Sub 11 0 R] /float [/Aside 11 0 R] /figures [/Sect 11 0 R] /tables [/Sect 11 0 R] >> endobj 15 0 obj -<< /Type /Namespace /NS (https://www.latex-project.org/ns/dflt/2022) /RoleMapNS 16 0 R >> +<< /Type /Namespace /NS (https://www.latex-project.org/ns/dflt) /RoleMapNS 16 0 R >> endobj 18 0 obj << /chapter [/H1 11 0 R] /section [/H2 11 0 R] /subsection [/H3 11 0 R] /subsubsection [/H4 11 0 R] /paragraph [/H5 11 0 R] /subparagraph [/H6 11 0 R] >> endobj 17 0 obj -<< /Type /Namespace /NS (https://www.latex-project.org/ns/book/2022) /RoleMapNS 18 0 R >> +<< /Type /Namespace /NS (https://www.latex-project.org/ns/book) /RoleMapNS 18 0 R >> endobj 19 0 obj << /Type /Namespace /NS (data:,C9B55C18-275C-494E-C10F-E4B83CD03F23) >> @@ -704,80 +704,80 @@ endobj xref 0 73 0000000002 65535 f -0000021934 00000 n +0000021940 00000 n 0000000003 00000 f 0000000004 00000 f 0000000010 00000 f -0000026429 00000 n -0000022448 00000 n -0000022823 00000 n -0000024880 00000 n -0000023505 00000 n +0000026513 00000 n +0000022542 00000 n +0000022917 00000 n +0000024964 00000 n +0000023599 00000 n 0000000012 00000 f -0000023573 00000 n +0000023667 00000 n 0000000014 00000 f -0000023643 00000 n +0000023737 00000 n 0000000020 00000 f -0000024406 00000 n -0000023724 00000 n -0000024684 00000 n -0000024513 00000 n -0000024791 00000 n +0000024500 00000 n +0000023818 00000 n +0000024773 00000 n +0000024602 00000 n +0000024875 00000 n 0000000000 00000 f -0000024941 00000 n +0000025025 00000 n 0000000020 00000 n 0000003353 00000 n -0000025039 00000 n -0000025127 00000 n -0000025215 00000 n -0000025315 00000 n -0000025426 00000 n +0000025123 00000 n +0000025211 00000 n +0000025299 00000 n +0000025399 00000 n +0000025510 00000 n 0000003586 00000 n 0000003921 00000 n -0000025577 00000 n -0000025711 00000 n -0000025832 00000 n -0000025957 00000 n -0000026078 00000 n +0000025661 00000 n +0000025795 00000 n +0000025916 00000 n +0000026041 00000 n +0000026162 00000 n 0000004121 00000 n -0000026210 00000 n -0000026331 00000 n -0000004189 00000 n -0000004240 00000 n -0000021847 00000 n -0000021712 00000 n -0000020999 00000 n -0000035068 00000 n -0000032552 00000 n -0000029052 00000 n -0000035434 00000 n -0000021981 00000 n -0000022017 00000 n -0000022044 00000 n -0000022213 00000 n -0000022402 00000 n -0000022519 00000 n -0000022786 00000 n -0000023402 00000 n -0000026566 00000 n -0000028012 00000 n -0000026654 00000 n -0000028235 00000 n -0000029205 00000 n -0000029404 00000 n -0000031438 00000 n -0000029542 00000 n -0000031659 00000 n -0000032706 00000 n -0000032906 00000 n -0000034022 00000 n -0000032954 00000 n -0000034250 00000 n -0000035228 00000 n -0000035496 00000 n -0000035540 00000 n +0000026294 00000 n +0000026415 00000 n +0000004192 00000 n +0000004246 00000 n +0000021853 00000 n +0000021718 00000 n +0000021005 00000 n +0000035152 00000 n +0000032636 00000 n +0000029136 00000 n +0000035518 00000 n +0000021987 00000 n +0000022023 00000 n +0000022050 00000 n +0000022301 00000 n +0000022495 00000 n +0000022613 00000 n +0000022880 00000 n +0000023496 00000 n +0000026650 00000 n +0000028096 00000 n +0000026738 00000 n +0000028319 00000 n +0000029289 00000 n +0000029488 00000 n +0000031522 00000 n +0000029626 00000 n +0000031743 00000 n +0000032790 00000 n +0000032990 00000 n +0000034106 00000 n +0000033038 00000 n +0000034334 00000 n +0000035312 00000 n +0000035580 00000 n +0000035624 00000 n trailer << /Size 73 /Root 72 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> startxref -35690 +35774 %%EOF diff --git a/testfiles-lua/test_xml.mlr b/testfiles-lua/test_xml.mlr index bc4dd76..703a9a0 100644 --- a/testfiles-lua/test_xml.mlr +++ b/testfiles-lua/test_xml.mlr @@ -133,7 +133,6 @@ ๐‘ - = ๐‘‘ ๐‘’ @@ -149,7 +148,6 @@ - = โˆ’ 1 @@ -163,31 +161,20 @@ 2 - = 3 ) - - - - - - + + 5 - - - - - - - - - + + + From 5ae44ec6c626e2675f1d73757fe5512f0d7f7409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 17 Feb 2025 08:47:12 +0100 Subject: [PATCH 188/206] Changelog update --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b2213f..705d0c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,13 @@ # Changelog -All notable changes to the `tagpdf` package since the -2021-04-22 will be documented in this file. +All notable changes to the `luamml` package since the +2025-02-17 will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## 2025-02-17 + ### Changed - Ulrike Fischer, 2024-11-29 luamml-structelemwriter.lua: moved the actualtext for e.g. stretched braces from the structure element to the mc-chunk. From 9d0b738c03d35e6358f114f95d4a9ef0b30079e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Mon, 17 Feb 2025 08:55:08 +0100 Subject: [PATCH 189/206] Tag new release v0.3.0 --- luamml-demo.sty | 2 +- luamml-patches-amsmath.sty | 2 +- luamml-patches-amstext.sty | 2 +- luamml-patches-kernel.sty | 2 +- luamml-patches-lab-math.sty | 2 +- luamml-patches-mathtools.sty | 2 +- luamml-pdf-demo.sty | 2 +- luamml.dtx | 6 +++--- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/luamml-demo.sty b/luamml-demo.sty index 9aabb38..e3fef94 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -1,5 +1,5 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesExplPackage{luamml-demo}{2024-10-30}{0.2.0}{Reasonable default definitions for luamml} +\ProvidesExplPackage{luamml-demo}{2025-02-17}{0.3.0}{Reasonable default definitions for luamml} \sys_if_engine_luatex:F { \msg_new:nnn {luamml-demo} {pdftex-option-ignored} {Option~`#1'~is~being~ignored~in~pdfTeX~mode.} diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 66ffdbe..f59d2ee 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-amsmath} {2024-10-30} {0.2.0} +\ProvidesExplPackage {luamml-patches-amsmath} {2025-02-17} {0.3.0} {Feel free to add a description here} \lua_now:n { require'luamml-amsmath' } diff --git a/luamml-patches-amstext.sty b/luamml-patches-amstext.sty index 3f16a86..f7d2443 100644 --- a/luamml-patches-amstext.sty +++ b/luamml-patches-amstext.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-amstext} {2024-10-30} {0.2.0} +\ProvidesExplPackage {luamml-patches-amstext} {2025-02-17} {0.3.0} {patches of amstext commands} % This is the same definition as in latex-lab-amsmath. It can go with the diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index bcd3064..d477635 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-kernel} {2024-10-30} {0.2.0} +\ProvidesExplPackage {luamml-patches-kernel} {2025-02-17} {0.3.0} {Feel free to add a description here} diff --git a/luamml-patches-lab-math.sty b/luamml-patches-lab-math.sty index c74a206..abb23ad 100644 --- a/luamml-patches-lab-math.sty +++ b/luamml-patches-lab-math.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-lab-math} {2024-10-30} {0.2.0} +\ProvidesExplPackage {luamml-patches-lab-math} {2025-02-17} {0.3.0} {Feel free to add a description here} % This definition is identical to the one in latex-lab-math. diff --git a/luamml-patches-mathtools.sty b/luamml-patches-mathtools.sty index e520190..1c9cb74 100644 --- a/luamml-patches-mathtools.sty +++ b/luamml-patches-mathtools.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-mathtools} {2024-10-26} {0.2.0} +\ProvidesExplPackage {luamml-patches-mathtools} {2025-02-17} {0.3.0} {Feel free to add a description here} \IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} {} diff --git a/luamml-pdf-demo.sty b/luamml-pdf-demo.sty index 73c93f0..1b3e245 100644 --- a/luamml-pdf-demo.sty +++ b/luamml-pdf-demo.sty @@ -1,5 +1,5 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesExplPackage{luamml-pdf-demo}{2024-10-30}{0.2.0}{Reasonable default definitions for luamml-pdf} +\ProvidesExplPackage{luamml-pdf-demo}{2025-02-17}{0.3.0}{Reasonable default definitions for luamml-pdf} \RequirePackage{luamml-pdf}% Loading luamml-pdf is pretty much the point % \RequirePackage{amsmath,array}% May come back if the patches get ported diff --git a/luamml.dtx b/luamml.dtx index f2c85fd..41bbf04 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% Copyright (C) 2020-2024 by Marcel Krueger +%% Copyright (C) 2020-2025 by Marcel Krueger %% %% This file may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either @@ -133,11 +133,11 @@ % \begin{macrocode} %<@@=luamml> %<*luatex> -\ProvidesExplPackage {luamml} {2024-10-30} {0.2.0} +\ProvidesExplPackage {luamml} {2025-02-17} {0.3.0} {Automatically generate presentational MathML from LuaTeX math expressions} % %<*pdftex> -\ProvidesExplPackage {luamml-pdf} {2024-10-30} {0.2.0} +\ProvidesExplPackage {luamml-pdf} {2025-02-17} {0.3.0} {MathML generation for LฬถuฬถaฬถpdfLaTeX} % % \end{macrocode} From 0d914e23216e445a4b8709b06a2b4031a511ad6d Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 21 Feb 2025 09:55:29 +0100 Subject: [PATCH 190/206] change name of equation label intent --- CHANGELOG.md | 12 ++++++++++++ luamml-structelemwriter.lua | 2 +- luamml-table.lua | 4 ++-- luamml.dtx | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 705d0c2..7896db6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,23 @@ All notable changes to the `luamml` package since the The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), this project uses date-based 'snapshot' version identifiers. + ## [Unreleased] +- Ulrike Fischer, 2025-02-21 + * change intent :equationlabel to :equation-label and + :noequationlabel to :no-equation-label + + ## 2025-02-17 ### Changed +- Ulrike Fischer, 2025-02-17 + * moved all patches into latex-lab + * added sockets to luamml.dtx + * changed handling of tags/labels: empty tags produces a row too and have an intent + * corrected small bugs + - Ulrike Fischer, 2024-11-29 luamml-structelemwriter.lua: moved the actualtext for e.g. stretched braces from the structure element to the mc-chunk. diff --git a/luamml-structelemwriter.lua b/luamml-structelemwriter.lua index 3087305..53718ae 100644 --- a/luamml-structelemwriter.lua +++ b/luamml-structelemwriter.lua @@ -123,7 +123,7 @@ local function write_elem(tree, stash) end for _, elem in ipairs(tree) do if type(elem) ~= 'string' and not elem['tex:ignore'] then - if elem['intent']==':equationlabel' and ltx.__tag.struct.luamml.labels then + if elem['intent']==':equation-label' and ltx.__tag.struct.luamml.labels then if #ltx.__tag.struct.luamml.labels > 0 then -- print("CHECK LABEL STRUCTURE: ",table.serialize(elem), table.serialize(ltx.__tag.struct.luamml.labels)) local num= table.remove(ltx.__tag.struct.luamml.labels,1) diff --git a/luamml-table.lua b/luamml-table.lua index 2333104..75fd1f7 100644 --- a/luamml-table.lua +++ b/luamml-table.lua @@ -58,14 +58,14 @@ end local function store_tag(xml) local mml_row = store_get_row() - xml.intent = ':equationlabel' + xml.intent = ':equation-label' table.insert(mml_row, 1, xml) last_tag = nil end local function store_notag(xml) local mml_row = store_get_row() - xml.intent = ':noequationlabel' + xml.intent = ':no-equation-label' table.insert(mml_row, 1, xml) end diff --git a/luamml.dtx b/luamml.dtx index 41bbf04..49c2791 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -763,7 +763,7 @@ % % If math structure elements are created the Lbl-structure of a tag % must be moved inside the math structure, typically as an additional column in an -% \texttt{mtable} with an intent \texttt{:equationlabel}. +% \texttt{mtable} with an intent \texttt{:equation-label} or \texttt{:no-equation-label}. % % The luamml-code handles this by stashing the Lbl-structure, storing the % structure number in an array and reusing it once it creates the math structure elements. From 20be02ee8c9d0d321760816fac9c7dd46983dd57 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Fri, 21 Feb 2025 13:24:23 +0100 Subject: [PATCH 191/206] step version --- CHANGELOG.md | 2 ++ luamml-demo.sty | 2 +- luamml-patches-amsmath.sty | 2 +- luamml-patches-amstext.sty | 2 +- luamml-patches-kernel.sty | 2 +- luamml-patches-lab-math.sty | 2 +- luamml-patches-mathtools.sty | 2 +- luamml-pdf-demo.sty | 2 +- luamml.dtx | 4 ++-- 9 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7896db6..0643637 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## 2025-02-21 + - Ulrike Fischer, 2025-02-21 * change intent :equationlabel to :equation-label and :noequationlabel to :no-equation-label diff --git a/luamml-demo.sty b/luamml-demo.sty index e3fef94..789de95 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -1,5 +1,5 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesExplPackage{luamml-demo}{2025-02-17}{0.3.0}{Reasonable default definitions for luamml} +\ProvidesExplPackage{luamml-demo}{2025-02-21}{0.4.0}{Reasonable default definitions for luamml} \sys_if_engine_luatex:F { \msg_new:nnn {luamml-demo} {pdftex-option-ignored} {Option~`#1'~is~being~ignored~in~pdfTeX~mode.} diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index f59d2ee..ad2f468 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-amsmath} {2025-02-17} {0.3.0} +\ProvidesExplPackage {luamml-patches-amsmath} {2025-02-21} {0.4.0} {Feel free to add a description here} \lua_now:n { require'luamml-amsmath' } diff --git a/luamml-patches-amstext.sty b/luamml-patches-amstext.sty index f7d2443..90800a2 100644 --- a/luamml-patches-amstext.sty +++ b/luamml-patches-amstext.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-amstext} {2025-02-17} {0.3.0} +\ProvidesExplPackage {luamml-patches-amstext} {2025-02-21} {0.4.0} {patches of amstext commands} % This is the same definition as in latex-lab-amsmath. It can go with the diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index d477635..05240ff 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-kernel} {2025-02-17} {0.3.0} +\ProvidesExplPackage {luamml-patches-kernel} {2025-02-21} {0.4.0} {Feel free to add a description here} diff --git a/luamml-patches-lab-math.sty b/luamml-patches-lab-math.sty index abb23ad..35725c7 100644 --- a/luamml-patches-lab-math.sty +++ b/luamml-patches-lab-math.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-lab-math} {2025-02-17} {0.3.0} +\ProvidesExplPackage {luamml-patches-lab-math} {2025-02-21} {0.4.0} {Feel free to add a description here} % This definition is identical to the one in latex-lab-math. diff --git a/luamml-patches-mathtools.sty b/luamml-patches-mathtools.sty index 1c9cb74..2b78030 100644 --- a/luamml-patches-mathtools.sty +++ b/luamml-patches-mathtools.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-mathtools} {2025-02-17} {0.3.0} +\ProvidesExplPackage {luamml-patches-mathtools} {2025-02-21} {0.4.0} {Feel free to add a description here} \IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} {} diff --git a/luamml-pdf-demo.sty b/luamml-pdf-demo.sty index 1b3e245..cf2ce9d 100644 --- a/luamml-pdf-demo.sty +++ b/luamml-pdf-demo.sty @@ -1,5 +1,5 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesExplPackage{luamml-pdf-demo}{2025-02-17}{0.3.0}{Reasonable default definitions for luamml-pdf} +\ProvidesExplPackage{luamml-pdf-demo}{2025-02-21}{0.4.0}{Reasonable default definitions for luamml-pdf} \RequirePackage{luamml-pdf}% Loading luamml-pdf is pretty much the point % \RequirePackage{amsmath,array}% May come back if the patches get ported diff --git a/luamml.dtx b/luamml.dtx index 49c2791..ed9114d 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -133,11 +133,11 @@ % \begin{macrocode} %<@@=luamml> %<*luatex> -\ProvidesExplPackage {luamml} {2025-02-17} {0.3.0} +\ProvidesExplPackage {luamml} {2025-02-21} {0.4.0} {Automatically generate presentational MathML from LuaTeX math expressions} % %<*pdftex> -\ProvidesExplPackage {luamml-pdf} {2025-02-17} {0.3.0} +\ProvidesExplPackage {luamml-pdf} {2025-02-21} {0.4.0} {MathML generation for LฬถuฬถaฬถpdfLaTeX} % % \end{macrocode} From 2528537f2e4375904401bcebc6b99df9f4972348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 21 Feb 2025 19:26:21 +0100 Subject: [PATCH 192/206] Fix license for CTAN upload --- .github/actions/ctan-upload/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/ctan-upload/action.yaml b/.github/actions/ctan-upload/action.yaml index 7de3a5b..3202baf 100644 --- a/.github/actions/ctan-upload/action.yaml +++ b/.github/actions/ctan-upload/action.yaml @@ -24,7 +24,7 @@ runs: author: 'Marcel Krรผger, LaTeX Project Team' uploader: ${{ inputs.uploader }} email: ${{ inputs.email }} - license: lppl1.3 + license: lppl1.3c summary: "Automatically generate MathML from LuaLaTeX math mode material" ctan-path: /macros/luatex/latex/luamml support: https://github.com/latex3/luamml/issues From 61e8466c88339614fe3e99a6e3b8b342de04b0fa Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sat, 22 Feb 2025 16:55:05 +0100 Subject: [PATCH 193/206] add class, change columnalign --- luamml-amsmath.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index 26b157b..6280dea 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -54,6 +54,7 @@ do local mml_table = get_table() if not mml_table then return end mml_table.displaystyle = true + mml_table.class=kind local columns = node.count(node.id'align_record', tex.lists.align_head)//2 mml_table.columnalign = kind == 'gathered' and 'center' or string.rep('right left', columns, ' ') local spacing = {} @@ -70,6 +71,7 @@ do -- TODO: Error handling etc local mml_table = get_table() mml_table.align = 'axis' + mml_table.class='smallmatrix' mml_table.columnalign = 'center' mml_table.columnspacing = '0.278em' mml_table.rowspacing = string.format('%.3fpt', tex.lineskip.width/65781.76) @@ -100,8 +102,9 @@ lua.get_functions_table()[funcid] = function() local mml_table = get_table() if not mml_table then return end mml_table.displaystyle = true + mml_table.class=kind local columns = node.count(node.id'align_record', tex.lists.align_head)//2 - mml_table.columnalign = kind == 'align' and string.rep('right left', columns, ' ') or nil + mml_table.columnalign = kind == 'align' and 'left '..string.rep('right left', columns, ' ') or nil mml_table.width = kind == 'multline' and '100%' or nil -- mml_table.side = kind == 'multline' and 'rightoverlap' or nil local spacing = {} From fcc83a2696544c2f74903841302be01f191e29af Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sun, 23 Feb 2025 18:16:53 +0100 Subject: [PATCH 194/206] continued-row in split --- luamml-amsmath.lua | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index 6280dea..7ed59b0 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -44,6 +44,22 @@ lua.get_functions_table()[funcid] = function() set_row_attribute('columnalign', token.scan_argument()) end +-- This fucntion is used to add a intent :continued-row to +-- rows of a split environment. +-- we assume that the table is a mtable with mrow with mtd. +-- we check row 2..n. If the first cell has only one element and +-- for this element 'tex:ignore' has been set, we assume a continued row and +-- set the intent on the mrow. +local function add_intent_continued_row (table) + for index,rowtable in ipairs(table) do + if table[index][1] and table[index][1][1] then -- just for safety ... + if index > 1 and #table[index][1]==1 and table[index][1][1]['tex:ignore'] then + table[index]['intent']=':continued-row' + end + end + end +end + do local saved funcid = luatexbase.new_luafunction'__luamml_amsmath_save_inner_table:n' @@ -55,6 +71,9 @@ do if not mml_table then return end mml_table.displaystyle = true mml_table.class=kind + if kind=="split" then + add_intent_continued_row (mml_table) + end local columns = node.count(node.id'align_record', tex.lists.align_head)//2 mml_table.columnalign = kind == 'gathered' and 'center' or string.rep('right left', columns, ' ') local spacing = {} From c83f29d9060e7fe1fe4984644138008e664d3a4d Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sun, 23 Feb 2025 19:13:53 +0100 Subject: [PATCH 195/206] remove star from class name --- luamml-amsmath.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index 7ed59b0..d64f7df 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -70,7 +70,7 @@ do local mml_table = get_table() if not mml_table then return end mml_table.displaystyle = true - mml_table.class=kind + mml_table.class=kind:gsub("*","") if kind=="split" then add_intent_continued_row (mml_table) end @@ -121,7 +121,7 @@ lua.get_functions_table()[funcid] = function() local mml_table = get_table() if not mml_table then return end mml_table.displaystyle = true - mml_table.class=kind + mml_table.class=kind:gsub("*","") local columns = node.count(node.id'align_record', tex.lists.align_head)//2 mml_table.columnalign = kind == 'align' and 'left '..string.rep('right left', columns, ' ') or nil mml_table.width = kind == 'multline' and '100%' or nil From 8b4e9490086f4009928824ce39b0f3245f1f811e Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sun, 23 Feb 2025 19:58:39 +0100 Subject: [PATCH 196/206] add system-of-equation intent --- luamml-amsmath.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index d64f7df..445c9f0 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -67,10 +67,11 @@ do lua.get_functions_table()[funcid] = function() -- TODO: Error handling etc local kind = token.scan_argument() + kind = kind:gsub("*","") local mml_table = get_table() if not mml_table then return end mml_table.displaystyle = true - mml_table.class=kind:gsub("*","") + mml_table.class=kind if kind=="split" then add_intent_continued_row (mml_table) end @@ -118,10 +119,15 @@ token.set_lua('__luamml_amsmath_finalize_table:n', funcid) lua.get_functions_table()[funcid] = function() -- TODO: Error handling etc local kind = token.scan_argument() + kind = kind:gsub("*","") local mml_table = get_table() if not mml_table then return end mml_table.displaystyle = true - mml_table.class=kind:gsub("*","") + mml_table.class=kind + -- this should perhaps be configurable and extendable + if kind == 'align' or 'alignat' or 'flalign' or 'xalignat' or 'xxalignat' then + mml_table.intent=":system-of-equation" + end local columns = node.count(node.id'align_record', tex.lists.align_head)//2 mml_table.columnalign = kind == 'align' and 'left '..string.rep('right left', columns, ' ') or nil mml_table.width = kind == 'multline' and '100%' or nil From 7b0890ba2420ec2b2e7a4d14ac3849a6592a3b5e Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sun, 23 Feb 2025 20:52:02 +0100 Subject: [PATCH 197/206] extend common@align@ending --- luamml-patches-amsmath.sty | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index ad2f468..8aeba03 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -7,6 +7,25 @@ % But they are almost identical to the original and only % add luamml commands in appropriate places, so they would % mostly disappear if there were enough hooks in amsmath. +\IfPackageAtLeastTF{latex-lab-testphase-math}{2025-02-24} + {} + { + \def\common@align@ending { + \math@cr \black@\totwidth@ + \UseExpandableTaggingSocket {math/luamml/mtable/finalize} {\@currenvir} + \egroup + \ifingather@ + \restorealignstate@ + \egroup + \nonumber + \ifnum0=`{\fi\iffalse}\fi + \else + $$% + \fi + \ignorespacesafterend + } + } + \IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} {} { From 11ac18a6f51aa6c9e870f8e4e25acb6000881389 Mon Sep 17 00:00:00 2001 From: David Carlisle Date: Sun, 23 Feb 2025 20:41:26 +0000 Subject: [PATCH 198/206] system-of-equation-s- --- luamml-amsmath.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index 445c9f0..dd04314 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -126,7 +126,7 @@ lua.get_functions_table()[funcid] = function() mml_table.class=kind -- this should perhaps be configurable and extendable if kind == 'align' or 'alignat' or 'flalign' or 'xalignat' or 'xxalignat' then - mml_table.intent=":system-of-equation" + mml_table.intent=":system-of-equations" end local columns = node.count(node.id'align_record', tex.lists.align_head)//2 mml_table.columnalign = kind == 'align' and 'left '..string.rep('right left', columns, ' ') or nil From 0b9c886c195518fceec295706537e4a2789e1b9e Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Wed, 26 Feb 2025 17:02:11 +0100 Subject: [PATCH 199/206] add debugging option --- luamml-amsmath.lua | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index dd04314..b8ef430 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -44,7 +44,7 @@ lua.get_functions_table()[funcid] = function() set_row_attribute('columnalign', token.scan_argument()) end --- This fucntion is used to add a intent :continued-row to +-- This function is used to add a intent :continued-row to -- rows of a split environment. -- we assume that the table is a mtable with mrow with mtd. -- we check row 2..n. If the first cell has only one element and @@ -60,6 +60,17 @@ local function add_intent_continued_row (table) end end +-- debug function for tables +-- activate with \directlua{debugmtable=2} or \directlua{debugmtable='split'} +local function debug_mtable (mtable,kind) + if debugmtable and (debugmtable==2) or (debugmtable==kind) then + texio.write_nl('==============') + texio.write_nl(kind) + texio.write_nl(table.serialize(mtable)) + texio.write_nl('==============') + end +end + do local saved funcid = luatexbase.new_luafunction'__luamml_amsmath_save_inner_table:n' @@ -82,6 +93,7 @@ do spacing[#spacing+1] = n.width == 0 and '0' or string.format('%.3fpt', n.width/65781.76) end mml_table.columnspacing = #spacing > 3 and table.concat(spacing, ' ', 2, #spacing-2) or nil + debug_mtable(mml_table,kind) saved = mml_table end @@ -96,6 +108,7 @@ do mml_table.columnspacing = '0.278em' mml_table.rowspacing = string.format('%.3fpt', tex.lineskip.width/65781.76) saved = {[0] = 'mpadded', width = '+0.333em', lspace = '0.167em', mml_table} + debug_mtable(mml_table,kind) saved = mml_table end @@ -137,6 +150,7 @@ lua.get_functions_table()[funcid] = function() spacing[#spacing+1] = n.width == 0 and '0' or '.8em' end mml_table.columnspacing = #spacing > 3 and table.concat(spacing, ' ', 2, #spacing-2) or nil + debug_mtable(mml_table,kind) save_result(mml_table, true) end From b2afb8400a9b2139feda164843fc5ce5b05d8404 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sun, 2 Mar 2025 19:30:36 +0100 Subject: [PATCH 200/206] add zero to columnspacing --- luamml-amsmath.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index b8ef430..bbf33fe 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -149,7 +149,7 @@ lua.get_functions_table()[funcid] = function() for n in node.traverse_id(node.id'glue', tex.lists.align_head) do spacing[#spacing+1] = n.width == 0 and '0' or '.8em' end - mml_table.columnspacing = #spacing > 3 and table.concat(spacing, ' ', 2, #spacing-2) or nil + mml_table.columnspacing = #spacing > 3 and "0 "..table.concat(spacing, ' ', 2, #spacing-2) or nil debug_mtable(mml_table,kind) save_result(mml_table, true) end From 7e98f39ee93f963de75c3594b3e6679b6413518e Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sun, 2 Mar 2025 20:35:50 +0100 Subject: [PATCH 201/206] add pause intent --- luamml-amsmath.lua | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/luamml-amsmath.lua b/luamml-amsmath.lua index bbf33fe..48732f3 100644 --- a/luamml-amsmath.lua +++ b/luamml-amsmath.lua @@ -60,6 +60,21 @@ local function add_intent_continued_row (table) end end +-- This function add an intent =":pause-medium" on every second mtd in a table +-- currently it is also on the first (after the label) but this could be changed +-- used in __luamml_amsmath_finalize_table:n for +-- 'align' or 'alignat' or 'flalign' or 'xalignat' or 'xxalignat' +local function add_intent_pause (mmltable) + for mtrindex,mtrtable in ipairs(mmltable) do + for mtdindex,mtdtable in ipairs(mtrtable) do + if (mtdindex % 2 == 0) then + mtdtable['intent']=':pause-medium' + end + end + end +end + + -- debug function for tables -- activate with \directlua{debugmtable=2} or \directlua{debugmtable='split'} local function debug_mtable (mtable,kind) @@ -140,6 +155,7 @@ lua.get_functions_table()[funcid] = function() -- this should perhaps be configurable and extendable if kind == 'align' or 'alignat' or 'flalign' or 'xalignat' or 'xxalignat' then mml_table.intent=":system-of-equations" + add_intent_pause (mml_table) end local columns = node.count(node.id'align_record', tex.lists.align_head)//2 mml_table.columnalign = kind == 'align' and 'left '..string.rep('right left', columns, ' ') or nil From 841fd4a88b67fb9a5eb4838102207b52bc08ab65 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Wed, 5 Mar 2025 15:57:02 +0100 Subject: [PATCH 202/206] update testfiles --- testfiles-lua/test_struct.tpf | 480 +++++++++++++++++----------------- testfiles-lua/test_xml.mlr | 14 +- 2 files changed, 247 insertions(+), 247 deletions(-) diff --git a/testfiles-lua/test_struct.tpf b/testfiles-lua/test_struct.tpf index 034a986..21ec100 100644 --- a/testfiles-lua/test_struct.tpf +++ b/testfiles-lua/test_struct.tpf @@ -28,9 +28,9 @@ endobj << /Type /Filespec /AFRelationship /Supplement /Desc (mathml-3) /F (mathml-3.xml) /UF /EF<> >> endobj 28 0 obj -<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 1014 >> +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 1203 >> stream - ๐‘Ž ๐‘ ๐‘ = ๐‘‘ ๐‘’ ๐‘“ ๐‘’ i ๐œ‹ = โˆ’ 1 ( 1 + 2 = 3 ) 5 + ๐‘Ž ๐‘ ๐‘ = ๐‘‘ ๐‘’ ๐‘“ ๐‘’ i ๐œ‹ = โˆ’ 1 ( 1 + 2 = 3 ) 5 endstream endobj 29 0 obj @@ -124,7 +124,7 @@ endobj << /O/NSO/NS 13 0 R/fence(true)/lspace(0)/maxsize(17.861pt)/minsize(17.861pt)/rspace(0)/symmetric(true) >> endobj 189 0 obj -<< /O/NSO/NS 13 0 R/columnalign(right left right left)/columnspacing(0 .8em 0)/displaystyle(true) >> +<< /O/NSO/NS 13 0 R/class(align)/columnalign(left right left right left)/columnspacing(0 0 .8em 0)/displaystyle(true)/intent(:system-of-equations) >> endobj 196 0 obj << /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 27 >> @@ -1798,27 +1798,27 @@ endobj xref 0 254 0000000002 65535 f -0000028070 00000 n +0000028308 00000 n 0000000003 00000 f 0000000004 00000 f 0000000010 00000 f -0000053863 00000 n -0000028275 00000 n -0000032099 00000 n -0000034284 00000 n -0000032919 00000 n +0000054101 00000 n +0000028513 00000 n +0000032337 00000 n +0000034522 00000 n +0000033157 00000 n 0000000012 00000 f -0000032987 00000 n +0000033225 00000 n 0000000014 00000 f -0000033057 00000 n +0000033295 00000 n 0000000020 00000 f -0000033820 00000 n -0000033138 00000 n -0000034093 00000 n -0000033922 00000 n -0000034195 00000 n +0000034058 00000 n +0000033376 00000 n +0000034331 00000 n +0000034160 00000 n +0000034433 00000 n 0000000000 00000 f -0000034345 00000 n +0000034583 00000 n 0000000020 00000 n 0000000299 00000 n 0000000486 00000 n @@ -1826,233 +1826,233 @@ xref 0000001318 00000 n 0000001800 00000 n 0000001987 00000 n -0000003150 00000 n -0000003337 00000 n -0000004016 00000 n -0000034484 00000 n -0000034573 00000 n -0000034662 00000 n -0000034763 00000 n +0000003339 00000 n +0000003526 00000 n +0000004205 00000 n +0000034722 00000 n +0000034811 00000 n 0000034900 00000 n 0000035001 00000 n -0000004203 00000 n -0000004518 00000 n -0000035287 00000 n -0000035382 00000 n -0000035505 00000 n -0000035600 00000 n -0000035723 00000 n -0000035818 00000 n -0000035941 00000 n -0000036036 00000 n -0000036159 00000 n -0000036254 00000 n -0000036377 00000 n -0000036472 00000 n -0000036595 00000 n -0000036690 00000 n -0000036814 00000 n -0000036909 00000 n -0000037033 00000 n -0000037128 00000 n -0000037252 00000 n -0000037347 00000 n -0000037471 00000 n -0000037607 00000 n -0000037719 00000 n -0000037843 00000 n -0000004718 00000 n -0000037978 00000 n -0000038102 00000 n -0000038197 00000 n -0000038292 00000 n -0000038416 00000 n -0000038543 00000 n -0000038638 00000 n -0000004789 00000 n -0000038761 00000 n -0000038887 00000 n -0000004843 00000 n -0000039021 00000 n -0000004930 00000 n -0000039120 00000 n -0000004985 00000 n -0000039230 00000 n -0000039344 00000 n -0000039455 00000 n -0000039566 00000 n -0000039677 00000 n -0000039776 00000 n -0000039911 00000 n -0000040046 00000 n -0000040158 00000 n -0000040293 00000 n -0000040403 00000 n -0000040510 00000 n -0000040614 00000 n -0000040718 00000 n -0000005057 00000 n -0000040817 00000 n -0000040918 00000 n -0000005111 00000 n -0000005327 00000 n -0000041170 00000 n -0000041304 00000 n -0000041429 00000 n -0000041565 00000 n -0000041674 00000 n -0000041799 00000 n -0000005527 00000 n -0000041937 00000 n -0000042063 00000 n -0000005593 00000 n -0000042201 00000 n +0000035138 00000 n +0000035239 00000 n +0000004392 00000 n +0000004707 00000 n +0000035525 00000 n +0000035620 00000 n +0000035743 00000 n +0000035838 00000 n +0000035961 00000 n +0000036056 00000 n +0000036179 00000 n +0000036274 00000 n +0000036397 00000 n +0000036492 00000 n +0000036615 00000 n +0000036710 00000 n +0000036833 00000 n +0000036928 00000 n +0000037052 00000 n +0000037147 00000 n +0000037271 00000 n +0000037366 00000 n +0000037490 00000 n +0000037585 00000 n +0000037709 00000 n +0000037845 00000 n +0000037957 00000 n +0000038081 00000 n +0000004907 00000 n +0000038216 00000 n +0000038340 00000 n +0000038435 00000 n +0000038530 00000 n +0000038654 00000 n +0000038781 00000 n +0000038876 00000 n +0000004978 00000 n +0000038999 00000 n +0000039125 00000 n +0000005032 00000 n +0000039259 00000 n +0000005119 00000 n +0000039358 00000 n +0000005174 00000 n +0000039468 00000 n +0000039582 00000 n +0000039693 00000 n +0000039804 00000 n +0000039915 00000 n +0000040014 00000 n +0000040149 00000 n +0000040284 00000 n +0000040396 00000 n +0000040531 00000 n +0000040641 00000 n +0000040748 00000 n +0000040852 00000 n +0000040956 00000 n +0000005246 00000 n +0000041055 00000 n +0000041156 00000 n +0000005300 00000 n +0000005516 00000 n +0000041408 00000 n +0000041542 00000 n +0000041667 00000 n +0000041803 00000 n +0000041912 00000 n +0000042037 00000 n +0000005716 00000 n +0000042175 00000 n 0000042301 00000 n -0000042434 00000 n -0000042543 00000 n -0000042669 00000 n -0000042795 00000 n -0000042933 00000 n -0000043059 00000 n -0000043185 00000 n -0000043311 00000 n -0000043420 00000 n -0000043546 00000 n -0000043672 00000 n -0000005665 00000 n -0000043809 00000 n -0000043912 00000 n -0000005725 00000 n -0000005930 00000 n -0000044132 00000 n -0000044268 00000 n -0000044379 00000 n -0000006133 00000 n -0000044517 00000 n -0000044643 00000 n -0000044754 00000 n -0000044880 00000 n -0000044966 00000 n -0000045076 00000 n -0000045202 00000 n -0000006219 00000 n -0000045340 00000 n -0000045449 00000 n -0000045575 00000 n -0000006274 00000 n -0000045713 00000 n -0000045816 00000 n -0000006334 00000 n -0000006563 00000 n -0000046119 00000 n -0000046235 00000 n -0000046361 00000 n -0000046487 00000 n -0000046613 00000 n -0000046737 00000 n -0000046874 00000 n -0000047000 00000 n -0000047126 00000 n -0000047252 00000 n -0000047350 00000 n -0000047459 00000 n -0000047585 00000 n -0000047694 00000 n -0000047832 00000 n -0000047958 00000 n -0000048074 00000 n -0000006766 00000 n -0000048212 00000 n -0000048350 00000 n -0000048476 00000 n -0000048603 00000 n -0000048727 00000 n -0000006832 00000 n -0000048865 00000 n -0000048991 00000 n -0000049129 00000 n -0000049255 00000 n -0000049371 00000 n -0000049508 00000 n -0000049634 00000 n -0000049772 00000 n -0000049859 00000 n -0000049946 00000 n -0000050073 00000 n -0000050171 00000 n -0000050297 00000 n -0000050384 00000 n -0000050471 00000 n -0000050558 00000 n -0000050685 00000 n -0000050795 00000 n -0000006956 00000 n -0000050926 00000 n -0000051050 00000 n -0000051174 00000 n -0000051298 00000 n -0000051401 00000 n -0000051588 00000 n -0000007074 00000 n -0000007245 00000 n -0000051787 00000 n -0000051992 00000 n -0000052130 00000 n -0000007448 00000 n -0000052268 00000 n -0000052394 00000 n -0000052532 00000 n -0000052670 00000 n -0000052808 00000 n -0000052946 00000 n -0000053072 00000 n -0000053210 00000 n -0000053336 00000 n -0000053462 00000 n -0000053600 00000 n -0000053737 00000 n -0000007524 00000 n -0000027966 00000 n -0000027827 00000 n -0000019308 00000 n -0000068957 00000 n -0000064688 00000 n -0000058364 00000 n -0000055682 00000 n -0000069317 00000 n -0000028117 00000 n -0000028154 00000 n -0000029021 00000 n -0000029933 00000 n -0000030886 00000 n -0000031848 00000 n -0000032036 00000 n -0000032678 00000 n -0000054002 00000 n -0000054711 00000 n -0000054034 00000 n -0000054934 00000 n -0000055838 00000 n -0000056040 00000 n -0000057300 00000 n -0000056113 00000 n -0000057531 00000 n -0000058527 00000 n -0000058736 00000 n -0000063194 00000 n -0000059021 00000 n -0000063424 00000 n -0000064851 00000 n -0000065060 00000 n -0000067742 00000 n -0000065246 00000 n -0000067965 00000 n -0000069114 00000 n -0000069381 00000 n -0000069427 00000 n -0000069561 00000 n +0000005782 00000 n +0000042439 00000 n +0000042539 00000 n +0000042672 00000 n +0000042781 00000 n +0000042907 00000 n +0000043033 00000 n +0000043171 00000 n +0000043297 00000 n +0000043423 00000 n +0000043549 00000 n +0000043658 00000 n +0000043784 00000 n +0000043910 00000 n +0000005854 00000 n +0000044047 00000 n +0000044150 00000 n +0000005914 00000 n +0000006119 00000 n +0000044370 00000 n +0000044506 00000 n +0000044617 00000 n +0000006322 00000 n +0000044755 00000 n +0000044881 00000 n +0000044992 00000 n +0000045118 00000 n +0000045204 00000 n +0000045314 00000 n +0000045440 00000 n +0000006408 00000 n +0000045578 00000 n +0000045687 00000 n +0000045813 00000 n +0000006463 00000 n +0000045951 00000 n +0000046054 00000 n +0000006523 00000 n +0000006752 00000 n +0000046357 00000 n +0000046473 00000 n +0000046599 00000 n +0000046725 00000 n +0000046851 00000 n +0000046975 00000 n +0000047112 00000 n +0000047238 00000 n +0000047364 00000 n +0000047490 00000 n +0000047588 00000 n +0000047697 00000 n +0000047823 00000 n +0000047932 00000 n +0000048070 00000 n +0000048196 00000 n +0000048312 00000 n +0000006955 00000 n +0000048450 00000 n +0000048588 00000 n +0000048714 00000 n +0000048841 00000 n +0000048965 00000 n +0000007021 00000 n +0000049103 00000 n +0000049229 00000 n +0000049367 00000 n +0000049493 00000 n +0000049609 00000 n +0000049746 00000 n +0000049872 00000 n +0000050010 00000 n +0000050097 00000 n +0000050184 00000 n +0000050311 00000 n +0000050409 00000 n +0000050535 00000 n +0000050622 00000 n +0000050709 00000 n +0000050796 00000 n +0000050923 00000 n +0000051033 00000 n +0000007145 00000 n +0000051164 00000 n +0000051288 00000 n +0000051412 00000 n +0000051536 00000 n +0000051639 00000 n +0000051826 00000 n +0000007312 00000 n +0000007483 00000 n +0000052025 00000 n +0000052230 00000 n +0000052368 00000 n +0000007686 00000 n +0000052506 00000 n +0000052632 00000 n +0000052770 00000 n +0000052908 00000 n +0000053046 00000 n +0000053184 00000 n +0000053310 00000 n +0000053448 00000 n +0000053574 00000 n +0000053700 00000 n +0000053838 00000 n +0000053975 00000 n +0000007762 00000 n +0000028204 00000 n +0000028065 00000 n +0000019546 00000 n +0000069195 00000 n +0000064926 00000 n +0000058602 00000 n +0000055920 00000 n +0000069555 00000 n +0000028355 00000 n +0000028392 00000 n +0000029259 00000 n +0000030171 00000 n +0000031124 00000 n +0000032086 00000 n +0000032274 00000 n +0000032916 00000 n +0000054240 00000 n +0000054949 00000 n +0000054272 00000 n +0000055172 00000 n +0000056076 00000 n +0000056278 00000 n +0000057538 00000 n +0000056351 00000 n +0000057769 00000 n +0000058765 00000 n +0000058974 00000 n +0000063432 00000 n +0000059259 00000 n +0000063662 00000 n +0000065089 00000 n +0000065298 00000 n +0000067980 00000 n +0000065484 00000 n +0000068203 00000 n +0000069352 00000 n +0000069619 00000 n +0000069665 00000 n +0000069799 00000 n trailer << /Size 254 /Root 252 0 R /Info 253 0 R /ID [ <2350CAD05F8A7AF0AA4058486855344F> <2350CAD05F8A7AF0AA4058486855344F> ] >> startxref -69694 +69932 %%EOF diff --git a/testfiles-lua/test_xml.mlr b/testfiles-lua/test_xml.mlr index 703a9a0..e1aa986 100644 --- a/testfiles-lua/test_xml.mlr +++ b/testfiles-lua/test_xml.mlr @@ -125,14 +125,14 @@ - + ๐‘Ž ๐‘ ๐‘ - + = ๐‘‘ ๐‘’ @@ -147,7 +147,7 @@ - + = โˆ’ 1 @@ -160,21 +160,21 @@ + 2 - + = 3 ) - + 5 + - - + From 70133abe67e68e70150cfeeb1939a2851f763be7 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Thu, 6 Mar 2025 11:04:48 +0100 Subject: [PATCH 203/206] suppress css in the tests --- testfiles-lua/test_sqrt.pvt | 2 +- testfiles-lua/test_struct.pvt | 2 +- testfiles-lua/test_structnum.pvt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/testfiles-lua/test_sqrt.pvt b/testfiles-lua/test_sqrt.pvt index c299491..776383e 100644 --- a/testfiles-lua/test_sqrt.pvt +++ b/testfiles-lua/test_sqrt.pvt @@ -9,7 +9,7 @@ \input{regression-test} \documentclass{article} \usepackage{unicode-math} -\tagpdfsetup{math/mathml/structelem} +\tagpdfsetup{math/mathml/structelem,attach-css=false} \begin{document} $ \sqrt{x} $ diff --git a/testfiles-lua/test_struct.pvt b/testfiles-lua/test_struct.pvt index 793a989..d78a16c 100644 --- a/testfiles-lua/test_struct.pvt +++ b/testfiles-lua/test_struct.pvt @@ -9,7 +9,7 @@ \input{regression-test} \documentclass{article} \usepackage{unicode-math} -\tagpdfsetup{math/mathml/structelem} +\tagpdfsetup{math/mathml/structelem,attach-css=false} \begin{document} hello diff --git a/testfiles-lua/test_structnum.pvt b/testfiles-lua/test_structnum.pvt index a9e3ca3..3a119b0 100644 --- a/testfiles-lua/test_structnum.pvt +++ b/testfiles-lua/test_structnum.pvt @@ -19,7 +19,7 @@ % suppress mathml-AF reading \tagpdfsetup{math/mathml/sources=} % -\tagpdfsetup{math/mathml/AF=false} +\tagpdfsetup{math/mathml/AF=false,attach-css=false} \begin{document} \ExplSyntaxOn From 99cbcbf444951cf7d2ee286b31c29a6fb3c83efc Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Thu, 6 Mar 2025 11:19:55 +0100 Subject: [PATCH 204/206] update changelog --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0643637..a8ada0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,16 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] + - Ulrike Fischer, 2025-03-06 + * add class attribute to math environments + * correct columnalign (take label column into account) + * add intent :continued-row in split enviroment + * add intent :system-of-equations to environments + * temporary patch to \common@align@ending to store the environment name + * start some debugging functions (variable debugmtable) + * correct columnspacing + * add intent :pause-medium between columns + ## 2025-02-21 - Ulrike Fischer, 2025-02-21 From 75746268bbc18ecac85887dad24e34b9a81271c0 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Thu, 6 Mar 2025 11:23:57 +0100 Subject: [PATCH 205/206] step version --- luamml-demo.sty | 2 +- luamml-patches-amsmath.sty | 2 +- luamml-patches-amstext.sty | 2 +- luamml-patches-kernel.sty | 2 +- luamml-patches-lab-math.sty | 2 +- luamml-patches-mathtools.sty | 2 +- luamml-pdf-demo.sty | 2 +- luamml.dtx | 4 ++-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/luamml-demo.sty b/luamml-demo.sty index 789de95..55d938a 100644 --- a/luamml-demo.sty +++ b/luamml-demo.sty @@ -1,5 +1,5 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesExplPackage{luamml-demo}{2025-02-21}{0.4.0}{Reasonable default definitions for luamml} +\ProvidesExplPackage{luamml-demo}{2025-03-06}{0.5.0}{Reasonable default definitions for luamml} \sys_if_engine_luatex:F { \msg_new:nnn {luamml-demo} {pdftex-option-ignored} {Option~`#1'~is~being~ignored~in~pdfTeX~mode.} diff --git a/luamml-patches-amsmath.sty b/luamml-patches-amsmath.sty index 8aeba03..5ebf157 100644 --- a/luamml-patches-amsmath.sty +++ b/luamml-patches-amsmath.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-amsmath} {2025-02-21} {0.4.0} +\ProvidesExplPackage {luamml-patches-amsmath} {2025-03-06} {0.5.0} {Feel free to add a description here} \lua_now:n { require'luamml-amsmath' } diff --git a/luamml-patches-amstext.sty b/luamml-patches-amstext.sty index 90800a2..4d9df9d 100644 --- a/luamml-patches-amstext.sty +++ b/luamml-patches-amstext.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-amstext} {2025-02-21} {0.4.0} +\ProvidesExplPackage {luamml-patches-amstext} {2025-03-06} {0.5.0} {patches of amstext commands} % This is the same definition as in latex-lab-amsmath. It can go with the diff --git a/luamml-patches-kernel.sty b/luamml-patches-kernel.sty index 05240ff..f75f363 100644 --- a/luamml-patches-kernel.sty +++ b/luamml-patches-kernel.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-kernel} {2025-02-21} {0.4.0} +\ProvidesExplPackage {luamml-patches-kernel} {2025-03-06} {0.5.0} {Feel free to add a description here} diff --git a/luamml-patches-lab-math.sty b/luamml-patches-lab-math.sty index 35725c7..e1283bb 100644 --- a/luamml-patches-lab-math.sty +++ b/luamml-patches-lab-math.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-lab-math} {2025-02-21} {0.4.0} +\ProvidesExplPackage {luamml-patches-lab-math} {2025-03-06} {0.5.0} {Feel free to add a description here} % This definition is identical to the one in latex-lab-math. diff --git a/luamml-patches-mathtools.sty b/luamml-patches-mathtools.sty index 2b78030..577cbcb 100644 --- a/luamml-patches-mathtools.sty +++ b/luamml-patches-mathtools.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage {luamml-patches-mathtools} {2025-02-21} {0.4.0} +\ProvidesExplPackage {luamml-patches-mathtools} {2025-03-06} {0.5.0} {Feel free to add a description here} \IfPackageAtLeastTF{latex-lab-testphase-math}{2025-01-24} {} diff --git a/luamml-pdf-demo.sty b/luamml-pdf-demo.sty index cf2ce9d..fe0a226 100644 --- a/luamml-pdf-demo.sty +++ b/luamml-pdf-demo.sty @@ -1,5 +1,5 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesExplPackage{luamml-pdf-demo}{2025-02-21}{0.4.0}{Reasonable default definitions for luamml-pdf} +\ProvidesExplPackage{luamml-pdf-demo}{2025-03-06}{0.5.0}{Reasonable default definitions for luamml-pdf} \RequirePackage{luamml-pdf}% Loading luamml-pdf is pretty much the point % \RequirePackage{amsmath,array}% May come back if the patches get ported diff --git a/luamml.dtx b/luamml.dtx index ed9114d..86c0d22 100644 --- a/luamml.dtx +++ b/luamml.dtx @@ -133,11 +133,11 @@ % \begin{macrocode} %<@@=luamml> %<*luatex> -\ProvidesExplPackage {luamml} {2025-02-21} {0.4.0} +\ProvidesExplPackage {luamml} {2025-03-06} {0.5.0} {Automatically generate presentational MathML from LuaTeX math expressions} % %<*pdftex> -\ProvidesExplPackage {luamml-pdf} {2025-02-21} {0.4.0} +\ProvidesExplPackage {luamml-pdf} {2025-03-06} {0.5.0} {MathML generation for LฬถuฬถaฬถpdfLaTeX} % % \end{macrocode} From b57813c1e8372a1f59deb8d013be7528b9c197f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Fabian=20Kr=C3=BCger?= Date: Fri, 7 Mar 2025 13:03:12 +0100 Subject: [PATCH 206/206] Add license to README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index afdf86e..f574142 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,9 @@ Run `l3build install` to install `luamml` into your local `texmf` tree. Add `\usepackage[tracing]{luamml-demo}` to print MathML to the terminal or `\usepackage[files]{luamml-demo}` to generate separate files with MathML output. Alternatively it can be used with latex-lab to automatically integrate with tagging infrastucture. +## License +LuaMML may be modified and distributed under the terms of the [LaTeX Project Public License](https://www.latex-project.org/lppl/), version 1.3c or greater. +It is written by Marcel Krรผger and the LaTeX Project Team.