Implement pdfTeX auto node counting
This commit is contained in:
parent
6da728c217
commit
5be2282e9b
@ -58,23 +58,27 @@
|
||||
% 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 {
|
||||
\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
|
||||
}
|
||||
#2
|
||||
\iow_write:Nx \c_log_iow {
|
||||
LUAMML_COUNT_END:
|
||||
\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:
|
||||
#2
|
||||
\iow_now:Nn \c_log_iow {
|
||||
LUAMML_COUNT_END
|
||||
}
|
||||
\__luamml_pdf_showlists:
|
||||
}
|
||||
|
||||
\NewDocumentCommand \RegisterFamilyMapping {m m} {
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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'
|
||||
|
@ -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}}}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user