当我尝试编译时:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[very thin, red] (0,0) circle (2);
\foreach \i in {0, 1, 2, ..., 46} \draw[very thin, red] ({360 * \i / 100}:1) circle (1);
\end{tikzpicture}
\end{document}
我有:
! Dimension too large.
<recently read> \pgfmath@x
l.6 ...thin, red] ({360 * \i / 100}:1) circle (1);
I can't work with sizes bigger than about 19 feet.
Continue and I'll use the largest value I can.
如果我转到46
,45
比如说\foreach \i in {0, 1, 2, ..., 45}
,该代码将通过编译。
似乎我尝试计算的某些值大于 TeX 引擎可以处理的值。
在 TeX.SX 上搜索了大约半个小时后,我找到了这,这和这这些问题虽然解决了,但问题的根源和结构仍不清楚。因此,我决定提出这个问题:极限(它的根源和形成)是什么,我该如何避免它。
任何线索都将受到感激。
答案1
TeX 尺寸算法是定点算法,基于整数算法缩放点 sp
.2^{16}sp=65536sp=1pt .
可存储的最大尺寸以纯 TeX 和 LaTeX 格式保存为\maxdimen
2^{30}sp = 16384pt ~ 18.9ft。
基本算术(例如由 实现的\dimexpr
)计算中的每个子项(而不仅仅是最终答案)都需要在 +/- 范围内\maxdimen
。
浮点包(例如fp
或)l3fp
可以处理浮点值和更大的范围,但这样做是通过避免使用 TeX dimen 寄存器并在宏中维护值并“手动”进行计算来实现的。
除了限制绝对值之外,这种转换为整数sp
算法的转换还限制了精度,例如 360/100 将被编码为 360pt/100 即 65536*360sp / 100,这在整数算法中已经无法准确计算。对于排版测量,少数舍入误差sp
实际上是肉眼看不见的,因此无关紧要,但是,如果 TeX 算法用于更广泛的计算,就会出现这些问题,正如您所发现的那样。