texlive[64345]
commits+karl at tug.org
commits+karl at tug.org
Sun Sep 11 22:44:40 CEST 2022
Revision: 64345
http://tug.org/svn/texlive?view=revision&revision=64345
Author: karl
Date: 2022-09-11 22:44:40 +0200 (Sun, 11 Sep 2022)
Log Message:
-----------
luapstricks (11sep22)
Modified Paths:
--------------
trunk/Master/texmf-dist/tex/lualatex/luapstricks/luapstricks.lua
Modified: trunk/Master/texmf-dist/tex/lualatex/luapstricks/luapstricks.lua
===================================================================
--- trunk/Master/texmf-dist/tex/lualatex/luapstricks/luapstricks.lua 2022-09-11 20:44:22 UTC (rev 64344)
+++ trunk/Master/texmf-dist/tex/lualatex/luapstricks/luapstricks.lua 2022-09-11 20:44:40 UTC (rev 64345)
@@ -18,8 +18,8 @@
if luatexbase then
luatexbase.provides_module {
name = 'luapstricks',
- version = 'v0.5',
- date = '2022-04-20',
+ version = 'v0.6',
+ date = '2022-09-10',
description = 'PSTricks backend for LuaLaTeX',
}
end
@@ -29,6 +29,13 @@
local pdfprint = vf.pdf -- Set later to have the right mode
local function gobble() end
+local function no_pdfprint_allowed()
+ pdfprint = gobble -- Don't warn more than once for each code block
+ tex.error("luapstricks: Graphics in immediate code segment", {
+ "There was an attempt to trigger drawing commands in an immediate code block. \z
+ This isn't allowed and will therefore be ignored."
+ })
+end
local pi = math.pi
local two_pi = 2*pi
@@ -4055,78 +4062,56 @@
end
end
---[[
- local readstate = status.readstate or status
- local context = string.format('%s:%i', readstate.filename, readstate.linenumber)
- local tokens = token.scan_argument(true)
- local n = node.new('whatsit', late_lua_sub)
- setwhatsitfield(n, 'data', function()
- assert(not ps_tokens)
- ps_tokens = tokens
- ps_context = context
- end)
- local nn = node.new('glyph')
- nn.subtype = 256
- nn.font, nn.char = fid, 0x1F3A8
- n.next = nn
- if tex.nest.ptr == 0 then
- -- Main vertical list. Here we might appear before the page starts properly
- -- and should not freeze page specifications. Since we don't have any outer dimensions,
- -- we can ensure this by sneaking our node into the current page list whithout going though
- -- build_page.
- tex.triggerbuildpage() -- First ensure that everything else is contributed properly.
- tex.lists.page_head = node.insert_after(tex.lists.page_head, nil, n)
- else
- node.write(n)
+-- If x, y shall be present iff direct ~= 'immediate'
+local function outer_execute(tokens, direct, context, x, y)
+ local TeXDict = userdict.value.TeXDict.value
+ local saved_ocount = TeXDict.ocount
+ local height = #operand_stack
+ TeXDict.ocount = height
+ local graphics_height
+ if direct ~= 'immediate' then
+ operand_stack[height + 1], operand_stack[height + 2] = x/65781.76, y/65781.76
+ if direct then
+ systemdict.value.moveto()
+ else
+ graphics_height = #graphics_stack
+ systemdict.value.gsave()
+ systemdict.value.translate()
+ end
end
-end
-]]
-local func = luatexbase.new_luafunction'luaPSTheader'
-token.set_lua('luaPSTheader', func, 'protected')
-lua.get_functions_table()[func] = function()
- local is_inline = token.scan_keyword'inline'
- local readstate = status.readstate or status
- local context = is_inline and string.format('%s:%i', readstate.filename, readstate.linenumber)
- local data = token.scan_argument(true)
- local n = node.new('whatsit', late_lua_sub)
- setwhatsitfield(n, 'data', function()
- if not is_inline then
- context = data
- local f = io.open(kpse.find_file(data, 'PostScript header'), 'r')
- data = f:read'a'
- f:close()
+ local success, err = pcall(execute_string, tokens, context)
+ if not success then
+ if type(err) == 'table' and err.pserror then
+ tex.error(string.format('luapstricks: %q error occured while executing PS code from %q', err.pserror, err.context), {
+ string.format('The error occured while executing the PS command %q.\n%s', err.tok, err.trace)
+ })
+ else
+ error(err, 0)
end
- local stack_depth = #operand_stack
-
- local x, y = pdf.getpos()
- local height = #operand_stack
- operand_stack[height + 1], operand_stack[height + 2] = x/65781.76, y/65781.76
- systemdict.value.moveto()
-
- local saved_pdfprint = pdfprint
- pdfprint = function(s) return pdf.print('direct', s .. '\n') end
- execute_string(data, context)
- flush_delayed()
- pdfprint = saved_pdfprint
- if #operand_stack ~= stack_depth then
- error'Unexpected values on operand stack'
+ end
+ flush_delayed()
+ if not direct then
+ systemdict.value.grestore()
+ if graphics_height ~= #graphics_stack then
+ if graphics_height < #graphics_stack then
+ texio.write_nl"luapstricks: PS block contains unbalanced gsave. grestore will be executed to compensate."
+ repeat
+ systemdict.value.grestore()
+ until graphics_height == #graphics_stack
+ else
+ texio.write_nl"luapstricks: PS block contains unbalanced grestore."
+ end
end
- end)
- node.write(n)
+ height = TeXDict.ocount or height
+ local new_height = #operand_stack
+ assert(new_height >= height)
+ for k = height + 1, new_height do
+ operand_stack[k] = nil
+ end
+ TeXDict.ocount = saved_ocount
+ end
end
---[[
-local func = luatexbase.new_luafunction'showPS'
-token.set_lua('showPS', func, 'protected')
-lua.get_functions_table()[func] = function()
- local command = token.scan_argument(true)
- -- This will break if any graphics commands are used.
- local tokens = parse_ps(command)
- execute_ps(tokens)
- systemdict.value.stack()
-end
-]]
-
local ps_tokens, ps_direct, ps_context, ps_pos_x, ps_pos_y
local fid = font.define{
name = 'dummy virtual font for PS rendering',
@@ -4151,54 +4136,9 @@
[1] = {
commands = {
{'lua', function()
- local tokens, direct = assert(ps_tokens), ps_direct
- ps_tokens = nil
- local x, y = pdf.getpos()
- local TeXDict = userdict.value.TeXDict.value
- local saved_ocount = TeXDict.ocount
- local height = #operand_stack
- TeXDict.ocount = height
- operand_stack[height + 1], operand_stack[height + 2] = ps_pos_x/65781.76, ps_pos_y/65781.76
- ps_pos_x, ps_pos_y = nil
- local graphics_height
- if direct then
- systemdict.value.moveto()
- else
- graphics_height = #graphics_stack
- systemdict.value.gsave()
- systemdict.value.translate()
- end
- local success, err = pcall(execute_string, tokens, ps_context)
- if not success then
- if type(err) == 'table' and err.pserror then
- tex.error(string.format('luapstricks: %q error occured while executing PS code from %q', err.pserror, err.context), {
- string.format('The error occured while executing the PS command %q.\n%s', err.tok, err.trace)
- })
- else
- error(err, 0)
- end
- end
- flush_delayed()
- if not direct then
- systemdict.value.grestore()
- if graphics_height ~= #graphics_stack then
- if graphics_height < #graphics_stack then
- texio.write_nl"luapstricks: PS block contains unbalanced gsave. grestore will be executed to compensate."
- repeat
- systemdict.value.grestore()
- until graphics_height == #graphics_stack
- else
- texio.write_nl"luapstricks: PS block contains unbalanced grestore."
- end
- end
- height = TeXDict.ocount or height
- local new_height = #operand_stack
- assert(new_height >= height)
- for k = height + 1, new_height do
- operand_stack[k] = nil
- end
- TeXDict.ocount = saved_ocount
- end
+ local tokens, x, y = assert(ps_tokens), ps_pos_x, ps_pos_y
+ ps_tokens, ps_pos_x, ps_pos_y = nil
+ return outer_execute(tokens, ps_direct, ps_context, x, y)
end}
}
},
@@ -4205,31 +4145,47 @@
},
}
-local modes = tex.getmodevalues()
local func = luatexbase.new_luafunction'luaPST'
token.set_lua('luaPST', func, 'protected')
lua.get_functions_table()[func] = function()
local readstate = status.readstate or status
local context = string.format('%s:%i', readstate.filename, readstate.linenumber)
- local direct = token.scan_keyword'direct'
+ local direct = token.scan_keyword'immediate' and 'immediate' or token.scan_keyword'direct' and 'direct'
+ local file = token.scan_keyword'file'
local tokens = token.scan_argument(true)
- local n = node.new('whatsit', late_lua_sub)
- setwhatsitfield(n, 'data', function(n)
- assert(not ps_tokens)
- ps_tokens = tokens
- ps_direct = direct
- ps_context = context
+ if file then
+ context = tokens
+ local f = io.open(kpse.find_file(tokens, 'PostScript header'), 'r')
+ tokens = f:read'a'
+ f:close()
+ end
+ if direct == 'immediate' then
+ local saved_pdfprint = pdfprint
+ pdfprint = no_pdfprint_allowed
+ outer_execute(tokens, direct, context)
+ pdfprint = saved_pdfprint
+ else
+ local n = node.new('whatsit', late_lua_sub)
+ setwhatsitfield(n, 'data', function(n)
+ assert(not ps_tokens)
+ ps_tokens = tokens
+ ps_direct = direct
+ ps_context = context
- local nn = node.new('glyph')
- nn.subtype = 256
- nn.font, nn.char = fid, 0x1F3A8
- local list = node.new('hlist')
- list.head = nn
- list.direction = 0
- node.insert_after(n, n, list)
- end)
- node.write(n)
+ local nn = node.new('glyph')
+ nn.subtype = 256
+ nn.font, nn.char = fid, 0x1F3A8
+ local list = node.new('hlist')
+ list.head = nn
+ list.direction = 0
+ node.insert_after(n, n, list)
+ end)
+ node.write(n)
+ end
end
+tex.runtoks(function()
+ tex.sprint[[\protected\def\luaPSTheader{\luaPST direct file}]]
+end)
do
func = luatexbase.new_luafunction'luaPSTcolor'
More information about the tex-live-commits
mailing list.