End of run logging

This commit is contained in:
Marcel Krüger 2020-06-06 03:03:52 +02:00
parent 4f5f4fd981
commit e59393de6f
2 changed files with 30 additions and 4 deletions

View File

@ -1,11 +1,13 @@
local pdf = pdf local pdf = pdf
local writer = require'luametalatex-nodewriter' local writer = require'luametalatex-nodewriter'
local newpdf = require'luametalatex-pdf' local newpdf = require'luametalatex-pdf'
local pfile local pdfname, pfile
local fontdirs = setmetatable({}, {__index=function(t, k)t[k] = pfile:getobj() return t[k] end}) local fontdirs = setmetatable({}, {__index=function(t, k)t[k] = pfile:getobj() return t[k] end})
local usedglyphs = {} local usedglyphs = {}
local dests = {} local dests = {}
local cur_page local cur_page
local whatsit_id = node.id'whatsit'
local whatsits = node.whatsits()
local colorstacks = {{ local colorstacks = {{
page = true, page = true,
mode = "direct", mode = "direct",
@ -16,6 +18,7 @@ token.scan_list = token.scan_box -- They are equal if no parameter is present
local spacer_cmd = token.command_id'spacer' local spacer_cmd = token.command_id'spacer'
local function get_pfile() local function get_pfile()
if not pfile then if not pfile then
pdfname = tex.jobname .. '.pdf'
pfile = newpdf.open(tex.jobname .. '.pdf') pfile = newpdf.open(tex.jobname .. '.pdf')
end end
return pfile return pfile
@ -36,6 +39,7 @@ token.luacmd("shipout", function()
cur_page = nil cur_page = nil
local content = pfile:stream(nil, '', out) local content = pfile:stream(nil, '', out)
pfile:indirect(page, string.format([[<</Type/Page/Parent %i 0 R/Contents %i 0 R/MediaBox[0 %i %i %i]/Resources%s%s>>]], parent, content, -math.ceil(list.depth/65781.76), math.ceil(list.width/65781.76), math.ceil(list.height/65781.76), resources, annots)) pfile:indirect(page, string.format([[<</Type/Page/Parent %i 0 R/Contents %i 0 R/MediaBox[0 %i %i %i]/Resources%s%s>>]], parent, content, -math.ceil(list.depth/65781.76), math.ceil(list.width/65781.76), math.ceil(list.height/65781.76), resources, annots))
node.flush_list(list)
token.put_next(token.create'immediateassignment', token.create'global', token.create'deadcycles', token.create(0x30), token.create'relax') token.put_next(token.create'immediateassignment', token.create'global', token.create'deadcycles', token.create(0x30), token.create'relax')
token.scan_token() token.scan_token()
end, 'force', 'protected') end, 'force', 'protected')
@ -83,9 +87,31 @@ callback.register("stop_run", function()
end end
pfile.root = pfile:getobj() pfile.root = pfile:getobj()
pfile.version = string.format("%i.%i", pdf.variable.majorversion, pdf.variable.minorversion) pfile.version = string.format("%i.%i", pdf.variable.majorversion, pdf.variable.minorversion)
local pages = #pfile.pages
pfile:indirect(pfile.root, string.format([[<</Type/Catalog/Version/%s/Pages %i 0 R%s>>]], pfile.version, pfile:writepages(), catalogdir)) pfile:indirect(pfile.root, string.format([[<</Type/Catalog/Version/%s/Pages %i 0 R%s>>]], pfile.version, pfile:writepages(), catalogdir))
pfile.info = write_infodir(pfile) pfile.info = write_infodir(pfile)
pfile:close() local size = pfile:close()
texio.write_nl("term", "(see the transcript file for additional information)")
-- TODO: Additional logging, epecially targeting the log file
texio.write_nl("term and log", string.format(" %d words of node memory still in use:", status.var_used))
local by_type, by_sub = {}, {}
for n, id, sub in node.traverse(node.usedlist()) do
if id == whatsit_id then
by_sub[sub] = (by_sub[sub] or 0) + 1
else
by_type[id] = (by_type[id] or 0) + 1
end
end
local nodestat = {}
local types = node.types()
for id, c in next, by_type do
nodestat[#nodestat + 1] = string.format("%d %s", c, types[id])
end
for id, c in next, by_sub do
nodestat[#nodestat + 1] = string.format("%d %s", c, whatsits[id])
end
texio.write_nl(" " .. table.concat(nodestat, ', '))
texio.write_nl(string.format("Output written on %s (%d pages, %d bytes).\n", pdfname, pages, size))
end, "Finish PDF file") end, "Finish PDF file")
token.luacmd("pdfvariable", function() token.luacmd("pdfvariable", function()
for n, t in pairs(pdf.variable_tokens) do for n, t in pairs(pdf.variable_tokens) do
@ -102,8 +128,6 @@ token.luacmd("pdfvariable", function()
texio.write_nl(string.format("Unknown PDF variable %s", token.scan_word())) texio.write_nl(string.format("Unknown PDF variable %s", token.scan_word()))
tex.sprint"\\unexpanded{\\undefinedpdfvariable}" tex.sprint"\\unexpanded{\\undefinedpdfvariable}"
end) end)
local whatsit_id = node.id'whatsit'
local whatsits = node.whatsits()
local lastobj = -1 local lastobj = -1
local lastannot = -1 local lastannot = -1

View File

@ -106,12 +106,14 @@ local function trailer(pdf)
end end
local function close(pdf) local function close(pdf)
trailer(pdf) trailer(pdf)
local size = pdf.file:seek()
if #pdf.version ~= 3 then if #pdf.version ~= 3 then
error[[Invalid PDF version]] error[[Invalid PDF version]]
end end
pdf.file:seek('set', 5) pdf.file:seek('set', 5)
pdf.file:write(pdf.version) pdf.file:write(pdf.version)
pdf.file:close() pdf.file:close()
return size
end end
local pagetree = require'luametalatex-pdf-pagetree' local pagetree = require'luametalatex-pdf-pagetree'
local pdfmeta = { local pdfmeta = {