在此问题 / 答案:一个人将逐字逐句的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\
"