尺寸过大错误(显然没有涉及计算)

尺寸过大错误(显然没有涉及计算)

从我目前所读的内容来看,aDimension too large!是由超出 16384 限制的结果或中间计算

我使用此文档时收到此错误(注意:doubledash设置来自这个答案;并且使用2pt而不是2.5pt不能解决问题。):

\documentclass[a4paper,12pt]{article}

\usepackage{tikz}
\usetikzlibrary{angles,decorations.markings}

\tikzset{doubledash/.style={decoration={ markings, %
mark= at position 0.5
      with{
        \draw (-1pt,-2.5pt) -- (-1pt,2.5pt);
        \draw (1pt,-2.5pt) -- (1pt,2.5pt);
      } },
      pic actions/.append code=\tikzset{postaction=decorate}}}

\begin{document}

\begin{tikzpicture}
% Text font size
\scriptsize

% Declare Points
\coordinate (G) at (0,0);
\coordinate (U) at (1.5,0);
\coordinate (M) at (0.75,0.661);

% Draw IsoscelesTriangle
\draw[thick] (G)
-- (U)
-- (M)
-- cycle
pic [draw, thick, angle radius = 0.25 cm, doubledash] {angle = U--G--M}
pic [draw, thick, angle radius = 0.25 cm, doubledash] {angle = M--U--G};

% Label Points
\draw (G) node[left] {G};
\draw (U) node[right] {U};
\draw (M) node[above] {M};
\end{tikzpicture}

\end{document}

确切的错误信息:

! Dimension too large.
<to be read again> 
\relax 
l.31 ...ius = 0.25 cm, doubledash] {angle = U--G--M}

doubledash两个标记似乎是出现错误所必需的,如果将它们两个都删除,则文档可以编译:

在此处输入图片描述

我猜测某些内部计算已经达到了 16384 的限制doubledash,但具体是怎么回事,我不知道...

值得注意的是,其他图片确实在保留的同时进行了编译,doubledash他们中有一些需要将坐标四舍五入到十分位,对于等腰三角形来说,这并不令人满意,因为三角形看起来会稍微倾斜。在上面的例子中,这个解决方案实际上也“有效”,但需要将 M 的坐标四舍五入到单位,这更糟糕(之后,三角形看起来根本不是等腰三角形!)。

更多背景信息

我目前正在开发一个软件库(用 Python 编写),它可以自动创建此类 TikZ 代码,我需要能够预测何时会触发此错误,以便生成可编译的图片。不可能尝试编译生成的代码,然后使用略有不同的值反复尝试,直到“正常”(图片可能与预期完全不同)。

问题

如何确保文档能够编译尝试编译?

编辑:从 Zarcos 的回答来看,增加角度的半径似乎可以解决问题。但如何才能预测图片编译良好所需的最小值?(第一个例子需要0.35 cm,而下面的第二个例子需要0.85 cm)。

无法编译的额外示例,但半径较大

\documentclass[a4paper,12pt]{article}

\usepackage{tikz}
\usetikzlibrary{angles,decorations.markings,quotes}

\tikzset{doubledash/.style={decoration={ markings, %
mark= at position 0.5
      with{
        \draw (-1pt,-2pt) -- (-1pt,2pt);
        \draw (1pt,-2pt) -- (1pt,2pt);
      } },
      pic actions/.append code=\tikzset{postaction=decorate}}}


\begin{document}

\begin{tikzpicture}
% Text font size
\scriptsize
% Declare Points
\coordinate (A) at (0,0);
\coordinate (E) at (-1.35,1.609);
\coordinate (F) at (-1.837,1.018);

% Draw Angles
\draw[thick] (E) -- (A) -- (F)
pic ["$\alpha$", draw, angle eccentricity=1.3333, angle radius = 0.84 cm, thick, doubledash] {angle = E--A--F};

% Label Points
\draw (A) node[below] {A};
\draw (E) node[above] {E};
\draw (F) node[below left] {F};
\end{tikzpicture}

\end{document}

答案1

您可以\tracingmacros=1在 \draw 命令之前添加到您的代码中。

然后您可以查看日志文件,很容易看到错误出现之前的几行(大约第 84000 行),pgf 只是试图计算一个相当小的数字(0.00006)的倒数。

       \pgfmath@reciprocaltemp ->0.00006

如果你有很多时间,你可以回顾一下计算过程,并尝试找出其中涉及的数学知识以及这对你的起始值意味着什么。但在我看来,核心问题是数学库不太好。

fpu 库可以更好地处理这些数字,但加载它不会取代相关的 pgf 命令,因此目前没有帮助。您可以为其提出功能请求。

xfp-package 也能毫无问题地处理这些值。因此,另一种选择是等待 Joseph Wright 完成 l3draw,以便将其用作 tikz 的基本层。

\documentclass[a4paper,12pt]{article}

\usepackage{tikz}
\usetikzlibrary{fpu}
\usepackage{xfp}
\begin{document}


%\pgfmathreciprocal{0.00006} %error

\makeatletter
\pgfmathfloatparsenumber{0.00006}
\pgfmathfloatreciprocal@{\pgfmathresult}
\pgfmathfloattofixed{\pgfmathresult}
\pgfmathresult
\makeatother

\fpeval{1/0.00006}

\end{document}

在此处输入图片描述

答案2

你的角度半径太小了。将其放大到 4 毫米。同时观察你的代码和我的代码之间的细微差别:

\documentclass[a4paper,12pt]{article}
\usepackage{tikz}
\usetikzlibrary{angles,decorations.markings}
\tikzset{
doubledash/.style={decoration = { markings, %
    mark= at position 0.5
    with{
        \draw[thin] (-0.6pt,-2pt) -- (-0.6pt,2pt);
        \draw[thin] ( 0.6pt,-2pt) -- ( 0.6pt,2pt);
        }},
      pic actions/.append code=\tikzset{postaction=decorate}
                },
    myangle/.style={draw, semithick, angle radius = 3.5mm, doubledash}
      }

\begin{document}
    \begin{tikzpicture}
% Text font size
\scriptsize
% Declare Points with labels
\coordinate[label= left:G]  (G) at (0,0);
\coordinate[label=right:U]  (U) at (1.5,0);
\coordinate[label=M]        (M) at (0.75,0.661);
% Draw IsoscelesTriangle
\draw[thick] (G) -- (U) -- (M) -- cycle
    pic [myangle] {angle = U--G--M}
    pic [myangle] {angle = M--U--G};
\end{tikzpicture}
    \end{document}

我也使代码稍微短一些。

在此处输入图片描述

附录:

添加角度名称:

\documentclass[a4paper,12pt]{article}
\usepackage{tikz}
\usetikzlibrary{angles, decorations.markings, quotes}
\tikzset{
doubledash/.style={decoration = { markings, %
    mark= at position 0.5
    with{
        \draw[thin] (-0.6pt,-2pt) -- (-0.6pt,2pt);
        \draw[thin] ( 0.6pt,-2pt) -- ( 0.6pt,2pt);
        }},
      pic actions/.append code=\tikzset{postaction=decorate}
                },
    myangle/.style={draw, semithick, 
                    angle radius = 3.5mm, angle eccentricity=1.5, doubledash},
      }

\begin{document}
    \begin{tikzpicture}
% Text font size
\scriptsize
% Declare Points with labels
\coordinate[label= left:G]  (G) at (0,0);
\coordinate[label=right:U]  (U) at (1.5,0);
\coordinate[label=M]        (M) at (0.75,0.661);
% Draw IsoscelesTriangle
\draw[thick] (G) -- (U) -- (M) -- cycle
    pic [myangle,"$\alpha$"] {angle = U--G--M}
    pic [myangle,"$\alpha$"] {angle = M--U--G};
\end{tikzpicture}
    \end{document}

在此处输入图片描述

相关内容