为什么乘法会\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
使得平衡更有价值。