如果浮动或盒子分割页面是否会产生错误?

如果浮动或盒子分割页面是否会产生错误?

浮动、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}

相关内容