浮动、parbox、minipage 和一些其他环境不能跨页面拆分。很好。在我的应用程序中,这不是问题。我可以轻松重写内容。
但是,LaTeX 似乎会采取某种措施来解决布局问题,而不会引发错误。也许它会让多余的内容超出页面底部。也许它会将内容移动到新页面。
我不希望 LaTeX 解决这个问题。如果我使用环境,但在排版过程中它不能完全放在一页上,那么我希望编译器立即停止,并显示错误消息。最好是我自己的消息。这可能吗?
我意识到我可以等排版完成,然后再检查 PDF。但在少数情况下,问题可能非常微妙,而且很容易被忽略。
将 LuaLaTex 与 TeXlive 2016 结合使用。无法使用 XeTeX。
编辑:正如 David Carlisle 在下面指出的那样,我的问题相当广泛。事实上,浮点数是根本原因:每个问题情况都有一个浮点数隐藏在其代码的深处。
答案1
您的问题比较笼统,而且没有例子。
在经典的 Tex 中,过满的垂直盒子是一种警告而不是错误,这种行为是 tex-the-program 内置的并且无法真正改变。(也许你可以在输出例程中对不良性进行测试,也许,但在 luatex 中,我会按照我在最后建议的那样去做)
LaTeX 按照你描述的方式“调整”事物的一个地方是,如果浮点数包含太多材料,那么你可以通过以下方式使其出错:
\makeatletter
\def \@largefloatcheck{%
\ifdim \ht\@currbox>\textheight
\@tempdima -\textheight
\advance \@tempdima \ht\@currbox
%%%\@latex@warning {Float too large for page by \the\@tempdima}%
\@latex@error{Float too large for page by \the\@tempdima}\@ehc
\ht\@currbox \textheight
\fi
}
\makeatother
然而,在 lualatex 中,你可以访问 Lua 回调vpack_quality
,因此,如果它的第一个参数是"overfull"
将其与 pdftex 和 luatex 进行比较
\documentclass{article}
\flushbottom
\ifx\directlua\undefined\else
\directlua{
function die_on_overfull(i,d,h,f,l)
if(i=="overfull") then
tex.error("overfull box",{"don't blame me, you asked for it"})
end
end
luatexbase.add_to_callback(
"vpack_quality",
die_on_overfull,
"make overfull vbox an error")
}\fi
\begin{document}
\section{one}
\rule{3cm}{20cm}
\section{two}
\rule{13cm}{4cm}
\rule{3cm}{10cm}
\section{three}
\rule{3cm}{4cm}
\rule{3cm}{4cm}
\end{document}
使用 pdftex
Overfull \vbox (39.95787pt too high) has occurred while \output is active
使用 luatex
! overfull box.
\@makecol ...putbox \vskip -\dimen@ \@textbottom }
\fi \global \maxdepth \@ma...
l.21 \section
{two}
? h
don't blame me, you asked for it
?
[2]
Overfull \hbox (24.88582pt too wide) in paragraph at lines 22--24
答案2
在测试了 David Carlisle 的答案后,我能够将其包装在新的环境中。这允许我打开和关闭错误,以便它仅在需要时出现:
\documentclass{article}
\flushbottom
\gdef\wraptest{ % enclosed code thanks to David Carlisle
\ifx\directlua\undefined\else
\directlua{
function die_on_overfull(i,d,h,f,l)
if(i=="overfull") then
tex.error("\noexpand\n\noexpand\n ERROR: wrapmyfloat overfull.\noexpand\n\noexpand\n",{"Page \thepage\space has `wrapmyfloat' environment that overflows the allowed area.\noexpand\n"})
end
end
luatexbase.add_to_callback(
"vpack_quality",
die_on_overfull,
"make overfull vbox an error")
}\fi
} % end gdef
\newenvironment{wrapmyfloat}
{\let\myresponse\wraptest%
\myresponse}
{\let\myresponse\relax}
\begin{document}
Test of wrapmyfloat, on following pages.\par
\section{one}
\rule{3cm}{20cm} % Is overfull, but no error, since not wrapped.
\section{two}
\begin{wrapmyfloat}
\rule{13cm}{4cm}
\rule{3cm}{10cm} % Change 10 to 20 to see overfull error.
\end{wrapmyfloat}
\section{three}
\rule{3cm}{4cm}
\rule{3cm}{4cm}
\end{document}