我正在考虑通过 LuaTeX 回调解决自动网格排版问题。最相关的一个似乎是append_to_vlist_filter
。(vpack
也可以,我支持,但解决方案不太优雅)
但是,它似乎确实能正常工作。文档对其返回值的说明相当模糊。
function(<node> box, <string> locationcode, <number prevdepth>, <boolean> mirrored)
return list, prevdepth
end
可以不返回任何内容,在这种情况下,您还需要刷新框或自行处理。prevdepth 也是可选的。位置是 box、alignment、equation、equation_number 和 post_linebreak
下面是一个简单的例子,
\documentclass{article}
\directlua{
function apvlist(head)
return head
end
luatexbase.add_to_callback("append_to_vlist_filter", apvlist, "apvlist")
}
\begin{document}
Test
\end{document}
我以为返回值list
表示节点列表的头部。在简单的示例中,原始框作为单个节点列表的头部返回。然而,编译时没有页面输出。
该文件的含义是什么冲洗盒子或自己处理?
答案1
我在 luatexja 中找到了与 Ulrike 相同的例子,所以我认为恒等函数类似于
\documentclass{article}
\directlua{
function apvlist(head,c,p,b)
print('adding ' .. type(head) .. ' in context ' .. c)
node.write(head)
return nil
end
luatexbase.add_to_callback("append_to_vlist_filter", apvlist, "apvlist")
}
\begin{document}
Test
\end{document}
哪些排版测试和回声
adding userdata in context post_linebreak
adding userdata in context box
adding userdata in context box
adding userdata in context box
adding userdata in context box
adding userdata in context box
但细节仍有点模糊。
答案2
在 2020/3/9 修复 LuaTeX 之后,相关示例现在应该可以正常工作。
的行为append_to_vlist_filter
解释如下源代码。回调负责创建行间跳过,这可以通过node.prepend_prevdepth
函数方便地处理。因此,身份回调如下:
\documentclass{article}
\directlua{
function apvlist(head, loc, prev_dp, mirror)
local new_head, new_dp = node.prepend_prevdepth(head, prev_dp)
% new_head is either head unchanged, or a skip linked with head
return new_head, new_dp
% alternatively, you can flush them manually and return nil
end
luatexbase.add_to_callback("append_to_vlist_filter", apvlist, "apvlist")
}
\begin{document}
\setlength{\baselineskip}{20pt}
Test 1
Test 2
\end{document}
另一个有趣的用法是https://tex.stackexchange.com/a/581716。