![如果文档不遵守某些既定规则,Xe/Latex 会收到警告](https://linux22.com/image/368267/%E5%A6%82%E6%9E%9C%E6%96%87%E6%A1%A3%E4%B8%8D%E9%81%B5%E5%AE%88%E6%9F%90%E4%BA%9B%E6%97%A2%E5%AE%9A%E8%A7%84%E5%88%99%EF%BC%8CXe%2FLatex%20%E4%BC%9A%E6%94%B6%E5%88%B0%E8%AD%A6%E5%91%8A.png)
如果乳胶文档不遵守某些预定义规则,是否有办法获得“可见”警告?例如,如果一个段落包含超过 7 行,我仍然希望我的文档被编译,但我希望获得“可见”警告。
答案1
你可以在 LuaLaTeX 中使用post_linebreak_filter
打回来。如果段落长度超过七行,它将在日志中显示警告。只需print
在函数内部替换为,error
即可使编译失败而不是警告。
\documentclass{article}
\usepackage{blindtext}
\usepackage{luacode}
\begin{luacode*}
local function check_lines (head)
local lines = 0
for line in node.traverse_id(node.id("hlist"), head) do
lines = lines + 1
end
if (lines > 7) then
print("\nWARNING: Paragraph with more than seven lines detected!\n")
end
return true
end
luatexbase.add_to_callback("post_linebreak_filter", check_lines, "check_lines", 0)
\end{luacode*}
\begin{document}
\Blindtext
\end{document}
我认为其他引擎不可能实现像 Lua 回调这样的自动化解决方案。如果你不介意将每个段落包装在一个环境中,你可以使用\eatlines
Victor Eijkhout 在他的书中介绍的方法TeX 按主题分类。这甚至可以告诉您错误段落出现在哪一行。
\documentclass{article}
\usepackage{blindtext}
\newbox\linebox
\newcount\linecount
\def\eatlines{%
\setbox\linebox\lastbox
\ifvoid\linebox
\else
\unskip\unpenalty
{\eatlines}%
\global\advance\linecount by 1
\box\linebox
\fi}
\newenvironment{countlinesinpar}{%
\global\linecount=0
\vbox\bgroup
}{
\par\eatlines\egroup
\ifnum\linecount>7
\message{^^JWARNING: Paragraph with more than seven lines detected at line \the\inputlineno!^^J}%
\fi
}
\begin{document}
\begin{countlinesinpar}
\blindtext
\end{countlinesinpar}
\end{document}
如果你真的不喜欢在环境中将每个段落换行,你可以尝试将魔法放在 中\everypar
。不幸的是,标准 LaTeX 文档类会\everypar
在随机点覆盖(例如\begin{document}
)。因此,你的文档可能会在随机位置意外爆炸。我已经注意到它没有正确处理缩进框,从而导致警告Overfull \hbox
。无论如何,将其放在 之后\begin{document}
:
\everypar={%
\global\linecount=0
\vbox\bgroup\everypar={}%
\def\par{%
\endgraf\eatlines\egroup\endgraf
\ifnum\linecount>7
\message{^^JWARNING: Paragraph with more than seven lines detected at line \the\inputlineno!^^J}%
\fi}
}