Closed leo-liu closed 8 years ago
整理了一下,只用几个 primitive 就能重现了,看起来是 \halign
的问题。
最小工作示例:
\halign{%
# & # \tabskip0pt \cr
a \crcr
}%
\end
对应的 log 文件:
This is Asian pTeX, Version 3.14159265 (preloaded format=ptex-ng 2016.2.26) 25 MAR 2016 12:47
entering extended mode
**z
(z [1
! Huge page cannot be shipped out.
\plainoutput ...headline \pagebody \makefootline }
\advancepageno \ifnum \out...
<output> {\plainoutput
}
<to be read again>
\end
l.6 \end
?
The following box has been deleted:
\vbox(667.20255+0.0)x31195147.66698, yoko direction
.\vbox(0.0+0.0)x469.75499, glue set 14.0fil, yoko direction
..\glue -22.5
..\hbox(8.5+0.0)x469.75499, glue set 469.75499fil, yoko direction
...\vbox(8.5+0.0)x0.0, yoko direction
...\glue 0.0 plus 1.0fil
..\glue 0.0 plus 1.0fil minus 1.0fil
.\vbox(643.20255+0.0)x31195147.66698, glue set 633.20255fill, yoko direction
..\glue(\topskip) 5.69446
..\hbox(4.30554+0.0)x31195147.66698, yoko direction
...\glue(\tabskip) 0.0
...\hbox(4.30554+0.0)x11.66667, yoko direction []
...\glue(\tabskip) 0.0
..\hbox(0.0+0.0)x469.75499
..\glue 0.0 plus 1.0fill
.\glue(\baselineskip) 17.55556
.\hbox(6.44444+0.0)x469.75499, glue set 232.37749fil, yoko direction
..\glue 0.0 plus 1.0fil minus 1.0fil
..\tenrm 1
..\glue 0.0 plus 1.0fil minus 1.0fil
] )
No pages of output.
应该是某个hpack出了问题,引发问题的是盒子:
.\vbox(643.20255+0.0)x31195147.66698, glue set 633.20255fill, yoko direction
..\glue(\topskip) 5.69446
..\hbox(4.30554+0.0)x31195147.66698, yoko direction
...\glue(\tabskip) 0.0
...\hbox(4.30554+0.0)x11.66667, yoko direction []
...\glue(\tabskip) 0.0
..\hbox(0.0+0.0)x469.75499
..\glue 0.0 plus 1.0fill
.\glue(\baselineskip) 17.55556
还在调试中
我开始也以为是 hpack
,后来用 printf
加 gdb 跟了半天才发现不是的。
在处理 \halign
过程里面一个一个排查,开始怀疑是 fin_row
、fin_col
之类的问题,最后才发现在 fin_align
里面。不停地用 show_node_list(preamble)
显示,开始还没事,过程结束时就错了。然后一步步找回这里。
代码不熟果然调试也没什么效率,囧。
以及 Pascal 转过来的代码真难看。
我正在查fin_align中的hpack到底哪里出了问题,应该是有个地方算错了。
大概查到是某个glue算错了。
我已经改了,是 r
抄成 c
了。
凑出来的重现代码:
算不上最小示例,但把
amsmath
和array
宏包里面的宏解析出来估计比较费时。总之足够重现错误了。无论是使用 W32TeX 的预编译版本还是目前库里面的版本,就会触发
! Dimension too large.
的错误。我估计是哪里计算长度的时候溢出了。同样的代码,
uplatex
编译是没有问题的。详细的 log 为: