LuaTeX:函数“node.effective_glue”在 \hfill 和 \vfill 上返回 0?

LuaTeX:函数“node.effective_glue”在 \hfill 和 \vfill 上返回 0?

我想使用 LuaTeX 的函数node.effective_glue来获取 \hfill 或 \vfill 的实际大小,但它在两种情况下都返回 0,我遗漏了什么?

以下是 MWE:

\documentclass[a4paper]{article}
\usepackage{fontspec}
\setlength{\textheight}{200pt}
\setlength{\textwidth}{200pt}

\directlua{
  GLUE  = node.id("glue")
  HLIST = node.id("hlist")
  showglue=function(head)
    while (head) do
    if head.id == GLUE then
       local w = node.effective_glue(head) / 65536
       texio.write_nl('*VGlue: ' .. head.subtype .. ' ' .. tostring(w) .. 'pt')
    elseif head.id == HLIST then
       line = head.head
       for n in node.traverse_id(GLUE,line) do
         local w = node.effective_glue(n,line) / 65536
         texio.write_nl(' HGlue: ' .. n.subtype .. ' ' .. tostring(w) .. 'pt')
       end
    end
    head = head.next
    end
    return true
  end
luatexbase.add_to_callback("pre_output_filter",showglue,"Show Glue")
}

\begin{document}
A\hskip 50pt\relax B\hfill C\par
\vskip 80pt\relax
M
\vfill
Z
\end{document}

.log文件显示:

*VGlue: 10 2.8399963378906pt % OK topskip
 HGlue: 0 50.0pt             % OK \hskip 50pt
 HGlue: 0 0.0pt              % \hfill ???
 HGlue: 15 0.0pt             % OK parfillskip
 HGlue: 9 0.0pt              % OK rightskip
*VGlue: 0 80.0pt             % OK \vskip 80pt
*VGlue: 3 0.0pt              % OK parskip
*VGlue: 2 4.9499969482422pt  % OK baselineskip
 HGlue: 15 0.0pt             % OK parfillskip
 HGlue: 9 0.0pt              % OK rightskip
*VGlue: 0 0.0pt              % \vfill ???
*VGlue: 3 0.0pt
*VGlue: 2 5.1699981689453pt
 HGlue: 15 0.0pt
 HGlue: 9 0.0pt
*VGlue: 0 0.0pt

注意:在第一次调用时,node.effective_glue我只传递了一个参数,我不知道“父”节点应该是什么。但我没有收到任何错误消息……

答案1

这两种情况有点不同:

  • 在执行时pre_output_filter,内容尚未装箱,因此您effective_glue还不能使用。(因为父级不存在)

    如果您确实需要它,您可以使用它tex.vpack从列表中构建一个 vlist,然后使用生成的节点作为父节点。但要小心,因为列表在最终发出之前仍可能发生变化。

  • 对于第二种情况,您必须确保parent是父节点(包含节点的 hlist 或 vlist),而不是列表的头部。 在您的例子中,这意味着您必须使用node.effective_glue(n,head)而不是node.effective_glue(n,line)。 (这里的命名有点混乱,因为您的head变量没有固定在头部)

相关内容