从我目前所读的内容来看,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}