出于 MWE 目的,我想在输入中出现时LuaLaTeX
打印。我注意到找到了文本,但我添加到缓冲区的函数中的调用仅在我从 Lua 调用不同的函数时才执行。任何关于这项工作的见解或讨论都将不胜感激。我已经看到并习惯于实现这种事情,也许问题就在那里?我尝试使用该方法,但在编译时遇到了一些问题。<---Found it!
XYZ
XYZ
tex.print
callback.register("process_input_buffer", ...)
luatexbase.add_to_callback("process_input_buffer",...)
callback.register
编辑:查看这个 wikihttp://wiki.luatex.org/index.php/Process_input_buffer,看来callback.register
应该使用该方法。
\documentclass{scrartcl}
\usepackage{luacode}
\begin{luacode*}
function found_keyword(s)
if string.find( s, "XYZ" ) then
tex.print("<---Found it!")
end
end
luatexbase.add_to_callback("process_input_buffer", found_keyword, "found_keyword")
\end{luacode*}
\begin{document}
Hello World.
XYZ % shouldn't "<---Found it!" print here?
~ % still not printed
. % still not printed
\begin{luacode*}
tex.print('') -- NOW it prints!
\end{luacode*}
\end{document}
答案1
LuaTeX 的process_input_buffer
回调在极早期就起作用了,前TeX 执行其常规处理(“眼睛”、“嘴巴”......)。
让我们来看看到底发生了什么。感兴趣的输入行是
XYZ % shouldn't "<---Found it!" print here?
重要的是,Lua 并不“知道”这%
是一个注释字符,而且%
一旦 LaTeX 开始工作,后面的所有内容都会被忽略。果然,string.find
它设法找到了“XYZ”。Lua 函数做了什么?为什么,它将字符串放在<---Found it!
行后,有效地使其成为
XYZ % shouldn't "<---Found it!" print here?<---Found it!
最终,控制权交给 LaTeX,由于字符串shouldn't "<---Found it!" print here?<---Found it!
位于注释字符后面,因此它会打印“XYZ”。
这个故事的寓意是什么?小心使用注释字符。
附录回答 OP 的后续评论/问题:以下是我可能重写代码以使其忽略(LaTeX)评论的方法。(这个可怕的实体[^\\]%%
意味着“一个%
角色不是前面有一个反斜杠字符。)
% !TEX TS-program = lualatex
\documentclass{scrartcl}
\usepackage{luacode}
\begin{luacode}
function found_keyword ( s )
s = s:sub ( 1 , s:find ( "[^\\]%%" ) ) -- delete any comments from 's'
if s:find ( "XYZ" ) then
return ( s .. " $\\leftarrow$ Found it!" )
end
end
luatexbase.add_to_callback ( "process_input_buffer" , found_keyword , "found_keyword" )
\end{luacode}
\begin{document}
Hello World.
XYZ
% XYZ
ABC % XYZ
100\% XYZ
\end{document}