在 process_input_buffer 钩子中执行 LuaLaTeX 打印

在 process_input_buffer 钩子中执行 LuaLaTeX 打印

出于 MWE 目的,我想在输入中出现时LuaLaTeX打印。我注意到找到了文本,但我添加到缓冲区的函数中的调用仅在我从 Lua 调用不同的函数时才执行。任何关于这项工作的见解或讨论都将不胜感激。我已经看到并习惯于实现这种事情,也许问题就在那里?我尝试使用该方法,但在编译时遇到了一些问题。<---Found it!XYZXYZtex.printcallback.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}

相关内容