改变盒子宽度后更新胶水

改变盒子宽度后更新胶水

我需要改变已保存框的宽度并希望它看起来好像是以该宽度构建的。

例如,这将 A 置于 4cm 宽的框的中心:

\hbox to 4cm{\hfil A\hfil}

但是这会将 B 置于原始 2cm 宽的盒子的中心,然后向右添加 2cm,使最终的盒子达到所需的宽度,但不告诉胶水:

\setbox0=\hbox to 2cm{\hfil B\hfil}
\wd0=4cm
\box0

这只是将文本放在左边,并且使用零宽度粘连:

\setbox0=\hbox{\hfil C\hfil}
\wd0=4cm
\box0

有没有办法改变宽度,使 B 和 C 像 A 一样位于调整后的框的中心?

结果

我不确定这是否会使它变得更容易或更难,但是我如何在 LuaTeX 中做到这一点,因为实际上我正在收集盒子,在 Lua 代码中调整它们,然后将它们放回原处,如下所示:

\setbox0=\hbox{\hfil D\hfil}%
\directlua{
  local b = node.copy(tex.box[0])
  b.width = tex.sp('4cm')
  node.write(b)
}

也就是说,在我处理框时,它已经被排版了,这将使存储标记并创建目标宽度的新框并再次排版的解决方案变得非常复杂。我希望有一个简单的 API 调用可以简单地重新计算这个?

答案1

\setbox0=\hbox{\hfil C\hfil}
\setbox0=\hbox to 4cm{\unhbox0}
\box0

答案2

为了完整性,这里是 Lua 版本,结果\unhbox只是访问head,有效地丢弃旧的 hbox,并构建一个具有精确宽度的新 hbox,就像普通版本一样:

\setbox0=\hbox{\hfil D\hfil}%
\directlua{
  local b = node.copy(tex.box[0])
  b = node.hpack(b.head, tex.sp('4cm'), 'exactly')
  node.write(b)
}

相关内容