预览,显示浮动的问题

预览,显示浮动的问题

在准备 SE 的答案时,我突然被预览包困住了。对以下代码进行 LaTeXing:

\documentclass{article}
    \usepackage{booktabs}
    \usepackage{siunitx}

\usepackage[active,floats,tightpage]{preview}
\setlength\PreviewBorder{5pt}%

\begin{document}
% dummy text ...
    \begin{table}
\begin{tabular}{c*{6}{S[table-number-alignment = center,
                                   table-figures-integer = 7]}
                }
\toprule
 0  & {1} &  {2} & {3} & {4} & {5} \\
\midrule
 1 & 11802316.16 & 10270230.14 &  210947.01 & 6716332.35 & 6808728.66 \\
 \bottomrule
\end{tabular}
    \end{table}
\end{document}

我收到错误:Output loop---100 consecutive dead cycles。如果我强制 pdfLaTeX 继续编译,它会完成并给出以下预览:

在此处输入图片描述

如果我没记错的话,以前也有过类似的情况。同时我只更新了我的 MikTeX 安装,但在软件包之间我没有看到preview软件包。我的 MWE 是否有错误,或者还有其他问题?

答案1

也许它会引起某些人的兴趣...选项消失的问题floats,如果在浮动环境中添加了位置选项h

\documentclass{article}
    \usepackage{booktabs}
    \usepackage{siunitx}

\usepackage[active,floats,tightpage]{preview}
\setlength\PreviewBorder{5pt}%

\begin{document}
    \begin{table}[h]% with added position option h works as desired
\begin{tabular}{c*{6}{S[table-number-alignment = center,
                                   table-figures-integer = 7]}
                }
\toprule
 0  & {1} &  {2} & {3} & {4} & {5} \\
\midrule
 1 & 11802316.16 & 10270230.14 &  210947.01 & 6716332.35 & 6808728.66 \\
 \bottomrule
\end{tabular}
    \end{table}
\end{document}

我还是不明白为什么这个有用。因为其他选项不起作用tb

答案2

让我引用 TeXbook,第 254 页底部和第 255 页顶部。

默认输出例程\shipout\box255说明了一种极端情况,即垂直列表中没有内容被放入下一页。另一种极端情况是

\output={\unvbox255
  \ifnum\outputpenalty<10000 \penalty\outputpenalty\fi}

不发货,而是一切返回到主垂直列表。(该命令\unvbox255将完成的页面从其框中取出,并\penalty\outputpenalty在所选断点处重新插入惩罚。)这使得完成的页面和后续材料无缝连接,因为 TeX 在调用例程时仍未丢弃断点处的粘连和惩罚\output;因此 TeX 将返回并重新考虑分页符。如果\vsize没有改变,并且所有插入都已保留,则会找到相同的分页符;但会比以前更快找到它,因为垂直列表已经构建 - 不需要再次进行分段。当然,像这样的输出例程会让 TeX 无休止地旋转,所以除了作为极端情况的示例外,它毫无用处。

为了防止这种循环,你的输出例程在开始运行的时候应该总是取得某种进展。如果你犯了一个错误,TeX 可以帮助你诊断错误,因为内置了一种特殊的循环检测机制:有一个名为 的内部整数变量\deadcycles,它在每次 之后被清除为零\shipout,而在每个 之前加 1。\output因此,\deadcycles会跟踪自最近一次 以来启动了多少次输出例程 \shipout,除非你自己更改 的值\deadcycles。还有一个名为 的整数参数\maxdeadcycles,普通 TeX 会将其设置为 25。如果\deadcycles大于或等于 \maxdeadcycles你的输出例程即将启动时的值(即\deadcycles即将增加时的值),TeX 会发出一条错误消息并执行默认输出例程而不是你的例程。

LaTeX 设置\maxdeadcycles为 100。

对于仅由环境组成的普通文档table,不会发生任何特殊情况。但是,preview它会丢弃除选定部分(在本例中为浮动部分)之外的所有内容。

它使用标准机制来实现这一点,但现在,作为浮点的默认定位tbp,输出例程被调用,\end{document}但什么也没有输出,因为没有任何东西触发刷新浮点队列。因此,该\deadcycles机制进入场景;浮点永远无法定位,但它仍然在那里,所以 TeX 再次尝试,以同样的方式失败。

无论你将 的值设置得多高\maxdeadcycles,错误还是会出现,可能稍晚一些。此时,将使用默认输出例程,并最终将插入内容发送出去。

解决方案:用作[htp]定位参数,或者在浮动外部添加一些文本,这些文本将被丢弃,但允许浮动进行定位。

\documentclass{article}
\usepackage{booktabs}
\usepackage{siunitx}

\usepackage[active,floats,tightpage]{preview}
\setlength\PreviewBorder{5pt}%

\begin{document}

uncommented dummy text

\begin{table}[h]
\begin{tabular}{
  c
  *{6}{
    S[table-number-alignment = center,
      table-format=8.2
     ]
  }
}
\toprule
0  & {1} &  {2} & {3} & {4} & {5} \\
\midrule
1 & 11802316.16 & 10270230.14 &  210947.01 & 6716332.35 & 6808728.66 \\
\bottomrule
\end{tabular}
\end{table}

\end{document}

(我修复了表格规格。)

另一方面,使用以下命令可以更轻松地获得相同的结果standalone

\documentclass[border=5]{standalone}
\usepackage{booktabs}
\usepackage{siunitx}

\begin{document}

\begin{tabular}{
  c
  *{6}{
    S[table-number-alignment = center,
      table-format=8.2
     ]
  }
}
\toprule
0  & {1} &  {2} & {3} & {4} & {5} \\
\midrule
1 & 11802316.16 & 10270230.14 &  210947.01 & 6716332.35 & 6808728.66 \\
\bottomrule
\end{tabular}

\end{document}

在此处输入图片描述

相关内容