我使用lualatex
(2023,Linux)进行编译,但我相信这是一个普遍的问题,也适用于pdflatex
:
在我的使用情况下,水平方向的溢出 badbox 确实很糟糕。因此,日志文件中有溢出规则、消息,我甚至可以lua-typo
在需要时使用 wonderful 包。
但我想要做的只是计算溢出水平线的数量。这是在连续文本中(也可能是脚注),而不是方程式、表格或图形中。如果没有 badboxes,那就好了。如果至少有一个,我想提供一个突出的消息,提醒用户查看日志文件。如果我能得到 badboxes 的数量,那么我就知道如何创建消息。在这个 MWE 中,它只是输入计数,而不是突出的消息:
\documentclass{article}
%\usepackage{fontspec} % Uncomment if compiling with lualatex
\newcounter{hoverfulls}
% This is the kind of code I seek:
%%%%% \AtOverfullHorixBadbox{\addtocounter{hoverfulls}
\AtEndDocument{\typeout{Detected \value{hoverfulls} overfull lines.}}
\begin{document}
LaTeX puts me to sleep, zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\par
But expl3 makes me scream eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\par
\end{document}
预期消息:Detected 2 overfull lines.
如何获取计数?肯定可以以某种方式完成,因为 TeXworks(可能还有其他 GUI)可以做到这一点。但我使用命令行。
答案1
我不会从 Lua 中执行此操作,我只需运行
grep -c 'Overfull \\hbox' file.log
运行 lualatex 后,
但是这个 Lua 回调产生了
Detected 2 overfull lines.
在终端并登录
\documentclass{article}
%\usepackage{fontspec} % Uncomment if compiling with lualatex
% Start pseudo-code:
\directlua{
ovcount = 0
local function foo (inc,d,h,f,l)
if inc == "overfull" then
ovcount = ovcount + 1
end
texio.write("\string\n" ..inc .. " box on line " .. l .. "\string\n")
end
luatexbase.add_to_callback("hpack_quality",foo,"overfull hbox counter")
}
\AtEndDocument{\typeout{Detected \directlua{tex.print(ovcount)} overfull lines.}}
% End pseudo-code.
\begin{document}
LaTeX puts me to sleep, zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\par
But expl3 makes me scream eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\par
\end{document}
笔记上述代码只会生成简短消息,并且仅适用于overfull
框消息,而不适用于其他类型。不幸的是,据我所知,如果使用此回调,luatex 不会提供对默认消息的访问权限,因此完整版本必须使用参数中提供的信息为所有类型重新创建消息。如果您可以返回一个值来标记您想要默认消息,那将很有用此外到自定义回调行为,但除非我错过了一些未提供的东西。