如何使用 LuaTeX `append_to_vlist_filter` 回调

如何使用 LuaTeX `append_to_vlist_filter` 回调

我正在考虑通过 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

相关内容