为什么 \dim_set:Nn 中的乘法会导致 LaTeX 崩溃?

为什么 \dim_set:Nn 中的乘法会导致 LaTeX 崩溃?

为什么乘法会\dim_set:Nn导致 LaTeX 崩溃?

我发现可以进行乘法运算,\fp_set:Nn例如

\fp_set:Nn \onefloat {5 * 6}

效果很好。

但是乘法\dim_set:Nn会导致 LaTeX 崩溃:

\dim_set:Nn \onetest {2 * \textwidth}

我还发现,如果\dim_set:Nn删除中的乘法符号,文档就会按预期构建。

\dim_set:Nn \onetest {2\textwidth}

例如,下面的代码会崩溃

\documentclass[11pt]{article}
\usepackage{expl3}

\ExplSyntaxOn

\dim_new:N \onetest
\dim_set:Nn \onetest {2 * \textwidth}

\newcommand{\myfirst}{ \dim_eval:n { \onetest } }

\ExplSyntaxOff

% Document
\begin{document}
    Some Text.
    \myfirst
    More text
\end{document}

但是当 * 它被删除时

\documentclass[11pt]{article}
\usepackage{expl3}

\ExplSyntaxOn
\dim_new:N \onetest
\dim_set:Nn \onetest {2\textwidth}

\newcommand{\myfirst}{ \dim_eval:n { \onetest } }

\ExplSyntaxOff

% Document
\begin{document}
    Some Text.
    \myfirst
    More text
\end{document}

将按预期运行。

我使用 LuaLaTex 构建文档。为什么乘法符号会导致崩溃?

答案1

\dim_set:Nn等都是 e-TeX\dimexpr基元的薄包装器。它在允许的内容方面具有相当严格的语法:\textwidth * 2可以,2 * \textwidth不可以,因为维度部分必须放在首位。

相比之下,\fp_set:Nn等是在宏中实现的,并在控制中进行解析expl3。因此,支持的语法更丰富:部分原因当然是没有要求以产生输出作为维度。

然而,宏解析是以牺牲性能为代价的。因此,虽然\dimexpr公式使用起来有点棘手,但事实上它是很多比解析更快,fp使得平衡更有价值。

相关内容