当我编译以下内容时,
\documentclass[a4paper]{article}
\usepackage{atbegshi}
\AtBeginShipout{\showlists}
\showboxdepth\maxdimen
\showboxbreadth\maxdimen
\usepackage{lipsum}
\newcommand\fnlipsum[1]
{%
\begingroup
\let\par\relax
\lipsum[#1]\footnote{\lipsum[#1]}
\endgroup
\par
}
\begin{document}
\fnlipsum{1}
\fnlipsum{2}
\fnlipsum{3}
\fnlipsum{4}
\end{document}
然后我在日志文件中看到
### current page: (held over for next output)
以及
### recent contributions:
中的一些内容\insert253
,在当前页面上,脚注 3 的其余部分是从第 1 页分离出来的,而在最近的贡献中,脚注 4 仍然嵌入在从主垂直列表分离出来的文本中。
现在我的问题是:
- “当前页面”和“最近贡献”在哪里?它们是方框吗?我能找到它们吗?也许用 LuaTeX?
- 我想过滤掉插入内容,即提取它们包含的内容并将其从各自的位置移除(分别用其他插入内容替换它们)。这可能吗?
答案1
无法回答 luatex 的问题,但经典 tex 中的答案或多或少是你无法获得它们(或者至少你无法在数据存在时获取它们)。那里)。
该afterpage
包需要掌握这些,以便它可以备份、插入指定的文本前输出例程保留的文本,以便指定的文本出现在下一页的顶部。
这里使用的技巧(可能对您有用也可能没用)是\aftergroup
在输出例程的隐式组之后插入一个特殊惩罚,这样输出例程就会在材料重新插入到主垂直列表时再次被调用。然后,特殊输出例程以正常方式查看 box255 中保留的材料。在这种afterpage
情况下,它会转储指定的标记,然后拆箱该材料,以便由正常输出例程重新收集。如果您闭上眼睛,不要太担心可能出错的地方,它有时会成功一半。
答案2
David 的回答非常好,但只是为了完整起见:在 luatex 中,tex.lists
表包含一小组指向保存该数据的节点列表的指针。
page_ins_head
:等待插入的循环列表contrib_head
:最近的贡献page_head
:当前页面内容hold_head
:用于保留到下一页的项目adjust_head
:当前\vadjust
列表的头部pre_adjust_head
:当前\vadjust
预列表的头部
事实上,你可以在 luatex 中修改这些节点列表(它们不是盒子,只是节点列表),但除非你愿意进行实验和测试很多,这样做可能不太明智。首先,这些列表的内部结构有内部要求(例如,它们是垂直模式材料,并且必须page_ins_head
是圆形的),而且内部排版引擎的各个部分都维护指向(特别是)前四个列表的指针和预先计算的信息。lua 接口尚未考虑这些。