我在玩 Hobby 曲线和标记时遇到了一个奇怪的错误。请考虑以下代码
\documentclass[tikz]{standalone}
\usetikzlibrary{decorations,decorations.markings,hobby}
\begin{document}
\begin{tikzpicture}
\draw[use Hobby shortcut,decorate,decoration={markings,
mark=between positions 0 and 1 step 0.3pt with }] (1,0.00001)..(1.2685,0.00001);
\end{tikzpicture}
\end{document}
它会抛出Dimension too large
错误。但是,将 1.2685 的值稍微增加一点(增加到 1.269 或更高)会使错误消失,但用 1.26855 替换它会使相同的错误再次出现。更有趣的是,使用 代替(2,0.00001)..(2.2685,0.00001)
是(1,0.00001)..(1.2685,0.00001)
可以的,但(2,0.00001)..(2.2,0.00001)
会再次抛出错误。
将 0.00001 改为 0 后,错误又消失了。0.3pt 值的变化似乎不会影响错误的发生。
这是怎么回事?阈值 1.2685 的由来是什么?当我们将所有内容移动 (0,1) 时,为什么这个阈值会发生变化?而且,最重要的是,这个错误实际上会导致生成的 PDF 出现错误吗?在我更复杂的有此类问题的文档中,我从未注意到此Dimension too large
错误对 PDF 有任何影响,这让我更加困惑。如果这很重要,我会使用 Overleaf。
答案1
对于 tkz-euclide,此错误是由于使用的veclen
值太小而导致的。在我的例子中,错误来自decoration
。我不知道这是否veclen
是唯一产生此错误的函数。
为了解决这个问题,我使用了一个选项(薛定谔的猫想法),我将其与一个范围一起使用以限制其作用(浪费时间)。这个想法是暂时通过 执行 的计算veclen
。xfp
我们lua
也可以使用。
唯一的问题是我从未使用过,hobby
所以我不知道,如果没有更多错误,我就不会得到结果。
\documentclass[tikz]{standalone}
\usepackage{xfp}
\usetikzlibrary{decorations,decorations.markings,hobby}
\makeatletter
% Schrodinger's cat idea 03/01/20
\tikzset{xfp/.code={%
\pgfmathdeclarefunction*{veclen}{2}{%
\begingroup%
\pgfmath@x##1pt\relax%
\pgfmath@y##2pt\relax%
\edef\tkz@xfpMathLen{\fpeval{sqrt((\pgf@x)^2+(\pgf@y)^2)}}
\pgfmath@returnone\tkz@xfpMathLen pt%
\endgroup%
}}}
\makeatother
\begin{document}
\begin{tikzpicture}
\begin{scope}[xfp]
\draw[use Hobby shortcut,decorate,decoration={markings,
mark=between positions 0 and 1 step 0.3pt with {.} }] (1,0.00001)..(1.2685,0.00001);
\end{scope}
\end{tikzpicture}
\end{document}