保持对溢出的坏箱进行计数,以便在最后发送消息?

保持对溢出的坏箱进行计数,以便在最后发送消息?

我使用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 不会提供对默认消息的访问权限,因此完整版本必须使用参数中提供的信息为所有类型重新创建消息。如果您可以返回一个值来标记您想要默认消息,那将很有用此外到自定义回调行为,但除非我错过了一些未提供的东西。

相关内容