diff options
Diffstat (limited to 'tex/context/base/mkiv/node-syn.lua')
| -rw-r--r-- | tex/context/base/mkiv/node-syn.lua | 109 | 
1 files changed, 78 insertions, 31 deletions
| diff --git a/tex/context/base/mkiv/node-syn.lua b/tex/context/base/mkiv/node-syn.lua index 9d716c44a..a00dc65ec 100644 --- a/tex/context/base/mkiv/node-syn.lua +++ b/tex/context/base/mkiv/node-syn.lua @@ -24,7 +24,16 @@ if not modules then modules = { } end modules ['node-syn'] = {  -- I only tested SumatraPDF with SciTE, for which one needs to configure in the  -- viewer:  -- --- InverseSearchCmdLine = c:\data\system\scite\wscite\scite.exe "%f" "-goto:%l" $ +--   InverseSearchCmdLine = c:\data\system\scite\wscite\scite.exe "%f" "-goto:%l" $ +-- +-- In fact, a way more powerful implementation would have been not to add a library +-- to a viewer, but letthe viewer call an external program: +-- +--   InverseSearchCmdLine = mtxrun.exe --script synctex --edit --name="%f" --line="%l" $ +-- +-- which would (re)launch the editor in the right spot. That way we can really +-- tune well to the macro package used and also avoid the fuzzy heuristics of +-- the library.  --  -- Unfortunately syntex always removes the files at the end and not at the start  -- (this happens in synctexterminate) so we need to work around that by using an @@ -124,10 +133,9 @@ local openfile, renamefile, removefile = io.open, os.rename, os.remove  local report_system = logs.reporter("system")  local tex                = tex +local texget             = tex.get  local nuts               = nodes.nuts -local tonut              = nuts.tonut -local tonode             = nuts.tonode  local getid              = nuts.getid  local getlist            = nuts.getlist @@ -168,14 +176,9 @@ local set_synctex_tag    = tex.set_synctex_tag  local force_synctex_tag  = tex.force_synctex_tag  local force_synctex_line = tex.force_synctex_line  ----- get_synctex_tag    = tex.get_synctex_tag ------ get_synctex_line   = tex.get_synctex_line +local get_synctex_line   = tex.get_synctex_line  local set_synctex_mode   = tex.set_synctex_mode -local getpos             = function() -                               getpos = backends.codeinjections.getpos -                               return getpos() -                           end -  local foundintree        = resolvers.foundintree  local eol                = "\010" @@ -199,6 +202,8 @@ local f_vlist_2          = formatters["v%i,%i:%i,%s:%i,%i,%i\010"]  local synctex            = luatex.synctex or { }  luatex.synctex           = synctex +local getpos ; getpos = function() getpos = job.positions.getpos return getpos() end +  -- status stuff  local enabled = false @@ -268,6 +273,34 @@ function synctex.resetfilename()      end  end +do + +    local nesting = 0 +    local ignored = false + +    function synctex.pushline() +        nesting = nesting + 1 +        if nesting == 1 then +            local l = get_synctex_line() +            ignored = l and l > 0 +            if not ignored then +                force_synctex_line(texget("inputlineno")) +            end +        end +    end + +    function synctex.popline() +        if nesting == 1 then +            if not ignored then +                force_synctex_line() +                ignored = false +            end +        end +        nesting = nesting - 1 +    end + +end +  -- the node stuff  local filehandle = nil @@ -324,6 +357,7 @@ end  function synctex.wrapup()      if tmpfile then          renamefile(tmpfile,logfile) +        tmpfile = nil      end  end @@ -340,9 +374,15 @@ local function flushpostamble()      enabled = false  end +local getpagedimensions  getpagedimensions = function() +    getpagedimensions = backends.codeinjections.getpagedimensions +    return getpagedimensions() +end +  -- local function doaction(action,t,l,w,h,d) +--     local pagewidth, pageheight = getpagedimensions()  --     local x, y = getpos() ---     filehandle:write(action(t,l,x,tex.pageheight-y,w,h,d)) +--     filehandle:write(action(t,l,x,pageheight-y,w,h,d))  --     nofobjects = nofobjects + 1  -- end  -- @@ -378,24 +418,27 @@ end  -- generic  --  -- local function doaction(t,l,w,h,d) +--     local pagewidth, pageheight = getpagedimensions()  --     local x, y = getpos() ---     filehandle:write(f_hlist_1(t,l,x,tex.pageheight-y,w,h,d)) +--     filehandle:write(f_hlist_1(t,l,x,pageheight-y,w,h,d))  --     nofobjects = nofobjects + 1  -- end  local x_hlist  do      local function doaction_1(t,l,w,h,d) +        local pagewidth, pageheight = getpagedimensions()          local x, y = getpos() -        filehandle:write(f_hlist_1(t,l,x,tex.pageheight-y,w,h,d)) +        filehandle:write(f_hlist_1(t,l,x,pageheight-y,w,h,d))          nofobjects = nofobjects + 1      end      -- local lastx, lasty, lastw, lasth, lastd      --      -- local function doaction_2(t,l,w,h,d) +    --     local pagewidth, pageheight = getpagedimensions()      --     local x, y = getpos() -    --     y = tex.pageheight-y +    --     y = pageheight-y      --     filehandle:write(f_hlist_2(t,l,      --         x == lastx and "=" or x,      --         y == lasty and "=" or y, @@ -412,8 +455,9 @@ local x_hlist  do      local lasty = false      local function doaction_2(t,l,w,h,d) +        local pagewidth, pageheight = getpagedimensions()          local x, y = getpos() -        y = tex.pageheight - y +        y = pageheight - y          filehandle:write(f_hlist_2(t,l,x,y == lasty and "=" or y,w,h,d))          lasty = y          nofobjects = nofobjects + 1 @@ -623,16 +667,10 @@ end  collect = collect_max  function synctex.collect(head,where) -    if enabled then -        if where == "object" then -            return head, false -        else -            local h = tonut(head) -            h = collect(h,h) -            return tonode(h), true -        end +    if enabled and where ~= "object" then +        return collect(head,head)      else -        return head, false +        return head      end  end @@ -645,10 +683,9 @@ function synctex.start()              writeanchor()              filehandle:write("{",nofsheets,eol)              -- this seems to work: -            local h = tex.pageheight -            local w = tex.pagewidth +            local pagewidth, pageheight = getpagedimensions()              filehandle:write(z_hlist) -            filehandle:write(f_vlist_1(0,0,0,h,w,h,0)) +            filehandle:write(f_vlist_1(0,0,0,pageheight,pagewidth,pageheight,0))          end      end  end @@ -678,7 +715,7 @@ function synctex.enable()          enabled = true          set_synctex_mode(3) -- we want details          if not used then -            nodes.tasks.appendaction("shipouts", "after", "luatex.synctex.collect") +            nodes.tasks.enableaction("shipouts","luatex.synctex.collect")              report_system("synctex functionality is enabled, expect 5-10 pct runtime overhead!")              used = true          end @@ -786,11 +823,21 @@ implement {  }  implement { -    name      = "synctexpause", -    actions   = synctex.pause, +    name    = "synctexpause", +    actions = synctex.pause,  }  implement { -    name      = "synctexresume", -    actions   = synctex.resume, +    name    = "synctexresume", +    actions = synctex.resume, +} + +interfaces.implement { +    name    = "synctexpushline", +    actions = synctex.pushline, +} +interfaces.implement { +    name    = "synctexpopline", +    actions = synctex.popline,  } + | 
