Compare commits

...

2 Commits

4 changed files with 76 additions and 27 deletions

View File

@ -3,12 +3,11 @@ local newpdf = require'luametalatex-pdf'
local pfile = newpdf.open(tex.jobname .. '.pdf') local pfile = newpdf.open(tex.jobname .. '.pdf')
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 = {}
print(token, token.luacmd)
token.luacmd("shipout", function() token.luacmd("shipout", function()
local voff = node.new'kern' local voff = node.new'kern'
voff.kern = tex.voffset + tex.sp'1in' voff.kern = tex.voffset + pdf.variable.horigin
voff.next = token.scan_list() voff.next = token.scan_list()
voff.next.shift = tex.hoffset + tex.sp'1in' voff.next.shift = tex.hoffset + pdf.variable.vorigin
local list = node.vpack(voff) local list = node.vpack(voff)
list.height = tex.pageheight list.height = tex.pageheight
list.width = tex.pagewidth list.width = tex.pagewidth
@ -34,3 +33,14 @@ callback.register("stop_run", function()
pfile:indirect(pfile.root, string.format([[<</Type/Catalog/Version/1.7/Pages %i 0 R>>]], pfile:writepages())) pfile:indirect(pfile.root, string.format([[<</Type/Catalog/Version/1.7/Pages %i 0 R>>]], pfile:writepages()))
pfile:close() pfile:close()
end, "Finish PDF file") end, "Finish PDF file")
token.luacmd("pdfvariable", function()
for n, t in pairs(pdf.variable_tokens) do
if token.scan_keyword(n) then
token.put_next(t)
return
end
end
-- The following error message gobbles the next word as a side effect.
-- This is intentional to make error-recovery easier.
error(string.format("Unknown PDF variable %s", token.scan_string()))
end)

View File

@ -2,6 +2,11 @@
\catcode`\^^^^ffff=11 \catcode`\^^^^ffff=11
\catcode`\@=11 \catcode`\@=11
\toks0{% \toks0{%
do
local function frozen(s)
local t = token.create(s)
return token.new(t.mode, t.command)
end
local dimen_cmd = token.command_id'assign_dimen' local dimen_cmd = token.command_id'assign_dimen'
local tex_params = {} local tex_params = {}
local texmeta = getmetatable(tex) local texmeta = getmetatable(tex)
@ -27,11 +32,35 @@
return texmetaoldnewindex(t, k, v) return texmetaoldnewindex(t, k, v)
end end
end end
local pdf_params = {}
pdf.variable_tokens = pdf_params
pdf.variable = setmetatable({}, {
__index = function(t, k)
local v = pdf_params[k]
if v then
if v.command == dimen_cmd then
return tex.dimen[v.index]
end
else
return texmetaoldindex(t, k)
end
end,
__newindex = function(t, k, v)
local p = pdf_params[k]
if p then
if p.command == dimen_cmd then
tex.dimen[p.index] = v
end
else
return texmetaoldnewindex(t, k, v)
end
end,
})
} }
\def\InternalAlloc#1#2#3#4#5{% \def\InternalAlloc#1#2#3#4#5{%
\csname new#3\endcsname#1% \csname new#3\endcsname#1%
\global#1=#5\relax \global#1=#5\relax
\etoksapp0{#2_params["\luaescapestring{#4}"] = token.create"\luaescapestring{\csstring#1}"} \etoksapp0{#2_params["\luaescapestring{#4}"] = frozen"\luaescapestring{\csstring#1}"}
} }
\def\internalAlloc#1#2#3{% \def\internalAlloc#1#2#3{%
\expandafter\InternalAlloc\csname ^^^^fffe#3@#1\endcsname{#1}{#2}{#3}% \expandafter\InternalAlloc\csname ^^^^fffe#3@#1\endcsname{#1}{#2}{#3}%
@ -39,11 +68,16 @@
\def\texAlloc#1#2{% \def\texAlloc#1#2{%
\expandafter\InternalAlloc\csname #2\endcsname{tex}{#1}{#2}% \expandafter\InternalAlloc\csname #2\endcsname{tex}{#1}{#2}%
} }
\def\pdfAlloc{%
\internalAlloc{pdf}%
}
\texAlloc{dimen}{pageheight}{11in} \texAlloc{dimen}{pageheight}{11in}
\texAlloc{dimen}{pagewidth}{8.5in} \texAlloc{dimen}{pagewidth}{8.5in}
% \internalAlloc{tex}{dimen}{pagewidth} \pdfAlloc{dimen}{horigin}{1in}
\pdfAlloc{dimen}{vorigin}{1in}
\directlua{ \directlua{
lua.prepared_code[\csstring#lua.prepared_code+1] = tex.toks[0] lua.prepared_code[\csstring#lua.prepared_code+1] = tex.toks[0] .. "end"
\the\toks0 \the\toks0
end
} }
\endgroup \endgroup

View File

@ -4,10 +4,10 @@ local functions = lua.getfunctionstable()
function lua.get_functions_table() return functions end function lua.get_functions_table() return functions end
local set_lua = token.set_lua local set_lua = token.set_lua
-- local new_luafunction = luatexbase.new_luafunction -- local new_luafunction = luatexbase.new_luafunction
local i=12342 local predefined_luafunctions = 0
local function new_luafunction(name) local function new_luafunction(name)
i = i+1 predefined_luafunctions = predefined_luafunctions + 1
return i return predefined_luafunctions
end end
function token.luacmd(name, func, ...) function token.luacmd(name, func, ...)
local idx = new_luafunction(name) local idx = new_luafunction(name)
@ -101,7 +101,7 @@ local function do_openout(p)
end end
end end
end end
functions[39] = function(_, immediate) -- \openout token.luacmd("openout", function(_, immediate) -- \openout
local file = token.scan_int() local file = token.scan_int()
token.scan_keyword'=' token.scan_keyword'='
local name = scan_filename() local name = scan_filename()
@ -113,14 +113,14 @@ functions[39] = function(_, immediate) -- \openout
properties[whatsit] = props properties[whatsit] = props
node.write(whatsit) node.write(whatsit)
end end
end end, "protected")
local function do_closeout(p) local function do_closeout(p)
if ofiles[p.file] then if ofiles[p.file] then
ofiles[p.file]:close() ofiles[p.file]:close()
ofiles[p.file] = nil ofiles[p.file] = nil
end end
end end
functions[40] = function(_, immediate) -- \closeout token.luacmd("closeout", function(_, immediate) -- \closeout
local file = token.scan_int() local file = token.scan_int()
local props = {file = file, handle = do_closeout} local props = {file = file, handle = do_closeout}
if immediate == "immediate" then if immediate == "immediate" then
@ -130,7 +130,7 @@ functions[40] = function(_, immediate) -- \closeout
properties[whatsit] = props properties[whatsit] = props
node.write(whatsit) node.write(whatsit)
end end
end end, "protected")
local function do_write(p) local function do_write(p)
local content = token.to_string(p.data) .. '\n' local content = token.to_string(p.data) .. '\n'
local file = ofiles[p.file] local file = ofiles[p.file]
@ -140,7 +140,7 @@ local function do_write(p)
texio.write_nl(p.file < 0 and "log" or "term and log", content) texio.write_nl(p.file < 0 and "log" or "term and log", content)
end end
end end
functions[41] = function(_, immediate) -- \write token.luacmd("write", function(_, immediate) -- \write
local file = token.scan_int() local file = token.scan_int()
local content = token.scan_tokenlist() local content = token.scan_tokenlist()
local props = {file = file, data = content, handle = do_write} local props = {file = file, data = content, handle = do_write}
@ -151,29 +151,31 @@ functions[41] = function(_, immediate) -- \write
properties[whatsit] = props properties[whatsit] = props
node.write(whatsit) node.write(whatsit)
end end
end end, "protected")
local lua_call_cmd = token.command_id'lua_call' local lua_call_cmd = token.command_id'lua_call'
functions[42] = function() -- \immediate token.luacmd("immediate", function() -- \immediate
local next_tok = token.scan_token() local next_tok = token.scan_token()
if next_tok.command ~= lua_call_cmd then if next_tok.command ~= lua_call_cmd then
return token.put_next(next_tok) return token.put_next(next_tok)
end end
local function_id = next_tok.index local function_id = next_tok.index
functions[function_id](function_id, 'immediate') functions[function_id](function_id, 'immediate')
end end, "protected")
functions[43] = function() -- \pdfvariable -- functions[43] = function() -- \pdfvariable
local name = token.scan_string() -- local name = token.scan_string()
print('Missing \\pdf' .. name) -- print('Missing \\pdf' .. name)
end -- end
token.set_lua("openout", 39, "protected")
token.set_lua("closeout", 40, "protected")
token.set_lua("write", 41, "protected")
write_tok = token.create'write'
token.set_lua("immediate", 42, "protected")
token.set_lua("pdfvariable", 43)
local prepared_code = lua.bytecode[1] local prepared_code = lua.bytecode[1]
if prepared_code then if prepared_code then
prepared_code() prepared_code()
prepared_code, lua.bytecode[1] = nil, nil prepared_code, lua.bytecode[1] = nil, nil
function fixupluafunctions()
new_luafunction = luatexbase.new_luafunction
fixupluafunctions = nil
end
else
function fixupluafunctions()
tex.setcount("global", "e@alloc@luafunction@count", predefined_luafunctions)
end
end end
require'luametalatex-back-pdf' require'luametalatex-back-pdf'

View File

@ -30,5 +30,8 @@
\input luametalatex-baseregisters \input luametalatex-baseregisters
\let\dump\savedversionofdump \let\dump\savedversionofdump
\let\savedversionofdump\undefined \let\savedversionofdump\undefined
\directlua{fixupluafunctions()}%
\everyjob\expandafter{\the\everyjob\directlua{fixupluafunctions()}}%
\directlua{fixupluafunctions()}%
\dump \dump
\endinput \endinput