我想使用 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
变量没有固定在头部)