对于一个相当长的文档(基于book
类别)的修订,我不仅想标记过满的水平盒子(得益于draft
类别选项,这很容易),而且当遇到过满的水平盒子时,还想添加特定的 TOC 条目(比如说“查看此页面上的过满水平盒子!”)。
此外,我想对过满的垂直盒子以及未满的水平盒子和垂直盒子执行类似的操作。
我看了LaTeX2e 来源并在LaTeX2e 的标准文档类但当箱子过满或未满时,无法找到任何执行操作的方法。你知道这是如何实现的吗?
答案1
这个仅限 luatex 的答案插入了一些代码(我从 chickenize 包中偷来的)以将文本作为字形列表和粘合节点插入到 hpack 回调报告为过满或欠满的任何框的末尾。
它实际上只是一个草图但或多或少可以用于这个例子。
\documentclass{article}
\makeatletter
\directlua{
GLYPH = node.id("glyph")
GLUE = node.id("glue")
%
function hpackshow (indicator,num,nd,f,l)
print('HPACK: ' .. indicator .. ' ' .. num)
if (indicator == 'overfull' or indicator == 'underfull' ) then
if (indicator == 'overfull') then
local pt = num / 65536.0
str = string.format("| overfull \@percentchar #.2fpt",pt)
else
str = string.format("| underfull badness " .. num)
end
nds = {}
nds[0]=node.new(GLYPH,1)
for i = 1,string.len(str) do
nds[i] = node.new(GLYPH,1)
nds[i].font = font.current()
nds[i-1].next = nds[i]
end
j = 1
for s in string.utfvalues(str) do
local char = unicode.utf8.char(s)
nds[j].char = s
if unicode.utf8.match(char,"\@percentchar s") then
nds[j] = node.new(GLUE)
nds[j].width = space
nds[j].shrink = shrink
nds[j].stretch = stretch
end
j = j+1
end
return nds[0]
end
end
%
luatexbase.add_to_callback('hpack_quality',hpackshow,'my hpack logger')
}
\begin{document}
somelongtextsomelongtext somelongtextsomelongtext somelongtextsomelongtext
somelongtextsomelongtext somelongtextsomelongtext somelongtextsomelongtext
somelongtextsomelongtext somelongtextsomelongtext somelongtextsomelongtext
somelongtextsomelongtext somelongtextsomelongtext somelongtextsomelongtext
somelongtextsomelongtext somelongtextsomelongtext somelongtextsomelongtext
\begin{minipage}{5cm}\fussy\parfillskip=0pt
onetwothree onetwothree
onezztzzzwothree onetwothree
onetwothree onetzzzzzwothree
onetzzzzwothree onetwothree
\end{minipage}
\end{document}