我可以防范“尺寸太大”错误吗?

我可以防范“尺寸太大”错误吗?

我正在尝试调试错误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

?

相关内容