我正在尝试调试错误tikzmark 过多导致“尺寸太大”错误这会导致Dimension too large
错误(呃)。我怀疑是什么原因造成的,也怀疑会出现一些情况,导致我无法完全消除它发生的可能性。
有什么方法可以防止这种错误吗?我真正想要的是类似try ... except ...
块的东西。这存在吗?
下面是一个可供尝试的 MWE:
\documentclass{article}
\newdimen\ad
\newdimen\bd
\ad=16383pt\relax
\bd=2\ad
\showthe\ad
\showthe\bd
\begin{document}
\end{document}
本质上,我希望能够将其包装\bd=2\ad
在某些允许我定义替代方案的东西中,如果它有可能触发可怕的Dimension too large
错误。
答案1
使用l3fp
来制作一个包装器宏,检查尺寸是否超过\c_max_dim
(或\maxdimen
或),并在分配超过它的情况下16383.99999pt
使用后备值(我将其设置为自身):\c_max_dim
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new:Npn \trydim #1
{
\exp_args:Nf
\__loopspace_try_dim:nn { \fp_eval:n {#1} } {#1}
}
\cs_new:Npn \__loopspace_try_dim:nn #1 #2
{
\fp_compare:nNnTF { abs(#1) } > \c_max_dim
{
% Exception code
\dim_use:N \c_max_dim
}
{
% Success code
% Using \dim_eval:n to maintain TeX's behaviour,
% but you can replace by #1, which is the result of \fp_eval:n
\dim_eval:n {#2}
}
}
\ExplSyntaxOff
\newdimen\ad
\newdimen\bd
\ad=\trydim{16383pt}
\bd=\trydim{2\ad}
\showthe\ad
\showthe\bd
\begin{document}
\end{document}
这将打印到终端:
> 16383.0pt.
l.31 \showthe\ad
?
> 16383.99998pt.
l.32 \showthe\bd
?
“异常代码”是当值超过时您要执行的操作\c_max_dim
。我使用了\dim_use:N \c_max_dim
来获取可能的最大值。
您猜对了,当值在允许范围内时,即为“成功代码”。我之所以使用,\dim_eval:n {#2}
是因为 的准确性存在争议l3fp
,因此只要 TeX 规则有效,结果就会遵守这些规则。当然,您可以将其更改为\fp_eval:n {#2}
(或者,就此而言,#1
,即\fp_eval:n
'ed 维度)。
或者,如果您愿意,可以使用内联后备值:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new:Npn \trydim #1 #2
{
\exp_args:Nf
\__loopspace_try_dim:nnTF { \fp_eval:n {#1} }
{#1} {#2}
}
\prg_new_conditional:Npnn \__loopspace_try_dim:nn #1 { T, F, TF }
{
\fp_compare:nNnTF { abs(#1) } > \c_max_dim
{ \prg_return_false: }
{ \prg_return_true: }
}
\ExplSyntaxOff
\newdimen\ad
\newdimen\bd
\ad=\trydim{16383pt}{0pt}
\bd=\trydim{2\ad}{10pt}
\showthe\ad
\showthe\bd
\begin{document}
\end{document}
打印内容:
> 16383.0pt.
l.31 \showthe\ad
?
> 10.0pt.
l.32 \showthe\bd
?