如何在 ConTeXt 中使用 LuaTeX 回调?(使用 LuaTeX 后端)
我主要关心的是 LuaTeX 和 LuaLaTeX 中可用的回调函数的使用process_input_buffer
。我用它来修改编译后的源代码,以反映我国习惯的排版规则(可能普遍习惯),避免单字母前缀结束行。
下一个平均能量损失应该说明:
行尾的单字母前缀(应避免):
\documentclass{article}
\usepackage{xcolor}
\begin{document}
Filling text filling text filling text filling text filling text filling text \textcolor{red}{filling V text}
\end{document}
正确版本:
\documentclass{article}
\usepackage{xcolor}
\usepackage{luacode}
\begin{luacode}
function pevnaMezera(s)
s = string.gsub(s, " V ", " V~")
return s
end
\end{luacode}
\AtBeginDocument{%
\directlua{luatexbase.add_to_callback(
"process_input_buffer", pevnaMezera , "pevnaMezera" )}
}
\begin{document}
Filling text filling text filling text filling text filling text filling text \textcolor{red}{filling V text}
\end{document}
我知道这个问题:如何在 ConTeXt 中注册回调; 然而,所给出的答案似乎仅关注回调pre_linebreak_filter
,它在 ConTeXt 中定义为finalizer
。
我在任何 ConTeXt 文档或 ConTeXt Garden 中都找不到有关终结器的任何信息。
笔记:在实际项目中,我在函数中使用 lua 正则表达式进行process_input_buffer
回调,为了简洁和可读性,我在 MWE 中做了更简单的定义来说明问题。
编辑3:
MWE 根据@Noone 的评论进行了更改:
\startluacode
userdata = userdata or {}
function userdata.pevnaMezera(s)
s = string.gsub(s, " V ", " V~")
return s
end
process_input_buffer = userdata.pevnaMezera
\stopluacode
\starttext
Filling text filling text filling text filling text filling text filling text filling text fil V text
\stoptext
不是添加不可中断空格。从语法角度来看,这是否正确??我尝试将“赋值”移至 luacode 块,但也没有用。
答案1
关于如何抑制单字母单词后的换行符的实际问题在此主题中得到了更好的回答:
在我开始展示如何在 ConTeXt 中注册自己的回调之前,先说一些警告(从我的评论中复制):
不要使用
process_input_buffer
它来搜索和替换文本!几乎不可能写下一个既充分又详尽的模式。此外,错误处理场景也令人恐惧,因为您要么得到一个非常难以调试的极其模糊的错误,要么根本没有错误,输出却默默地乱码。
搞定这些之后,我们开始吧。ConTeXt 默认设置了自己的回调机制,称为processors
并finalizers
“冻结”原始 LuaTeX 回调,即,如果您尝试注册一个回调,则会使它们不可用并发出错误。原因是 ConTeXt 注册了自己的回调,这些回调紧密耦合,如果您篡改它们,则会出现故障。但是,可以通过添加来解冻回调
\enabledirectives[system.callbacks.permitoverloads]
到你的文档。之后你可以像往常一样注册回调,例如
\startluacode
callbacks.register("process_input_buffer", function(line)
return line
end)
\stopluacode
请注意,LMTX 中的回调与 MkIV 有很大不同,一些回调已被删除,而其他回调已被添加。process_input_buffer
例如,回调已在 LMTX 中删除。
启用上述指令后,ConTeXt 将在日志中向您显示以下警告:
system >
system > The callback system has been brought in an unprotected state. As a result of directly
system > setting of callbacks subsystems of ConTeXt can stop working. There is no support for
system > bugs resulting from this state. It's better to use the official extension mechanisms.
system >
这应该更加清楚地表明,不应该使用它。