![预览,显示浮动的问题](https://linux22.com/image/316899/%E9%A2%84%E8%A7%88%EF%BC%8C%E6%98%BE%E7%A4%BA%E6%B5%AE%E5%8A%A8%E7%9A%84%E9%97%AE%E9%A2%98.png)
在准备 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}
我还是不明白为什么这个有用。因为其他选项不起作用t
。b
答案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}