在 LuaLaTeX 中,如何将环境的内容逐字传递给 Lua **而不在投影仪框架中显示它**?

在 LuaLaTeX 中,如何将环境的内容逐字传递给 Lua **而不在投影仪框架中显示它**?

在此问题 / 答案:一个人将逐字逐句的latex材料传递给lua,但latex他自己却展示了这些材料。如果一个人隐藏了这两行:

local buf_without_end = mybuf:gsub("\\end{foobar}\n","")
print(string.format("Lua: %q", buf_without_end))

材质不会消失。我想使用 lua 代码修改此材质,然后显示它。

\documentclass{beamer}
\usepackage{luacode,tikz}

\directlua{dofile("verb.lua")}

\newenvironment{LuaVerb}{%
    \directlua{start_recording()}}{%
    \directlua{stop_recording()}
}

\begin{document}

\begin{frame}

% pass the material to lua
\begin{LuaVerb}
    hello word
\end{LuaVerb}

% use of this material, but with or witout this line
% the material is displayed

%\directlua{print_recording()}

\end{frame}

\end{document}

verb.lua

tp = tex.print

mybuf = ""

function readbuf( buf )
    mybuf = mybuf .. buf .. "\n" 
end

function start_recording()
    luatexbase.add_to_callback('process_input_buffer', readbuf, 'readbuf')
end

function stop_recording()
    luatexbase.remove_from_callback('process_input_buffer', 'readbuf')
end

function print_recording()
    local buf_without_end = mybuf:gsub("\\end{LuaVerb}\n","")
    print(string.format("Lua: %q", buf_without_end))
    mybuf = ""
end

答案1

如果您不想将行传递给 LaTeX,则必须从回调中返回空字符串,否则回调将在返回值为 时传递行nil。由于您不返回任何值,因此隐式使用 nil。并且由于 LaTeX 不再处理输入,因此您必须\end{LuaVerb}从 Lua 端解析输入,否则您将抓取所有行直到结尾:

local end_verb = '%s*\\end{LuaVerb}'

function readbuf( buf )
    if buf:match(end_verb) then 
        return buf 
    end
    mybuf = mybuf .. buf .. "\n" 
    return ""
end

现在出现了一些奇怪的问题beamer,这可能是由frames处理方式引起的,因为没有使用打印输出print_recording()。但是当我将文档类更改为时article,我得到了:

(/opt/texlive/2013/texmf-dist/tex/luatex/luatexbase/mcb.lua)))) (./jej.aux)Lua: 
"    hello word\
"

相关内容