为什么我的维度表达式中需要 \fp_to_dim:n?

为什么我的维度表达式中需要 \fp_to_dim:n?

我尝试在维度计算中使用expel浮点变量 ( ) 。以下代码有效(解决方案来自\l_@@_last_machine_row_x_fp\l_@@_bar_width_dim\BarA这个答案),但\BarB不起作用。

\documentclass[parskip]{scrartcl}

\usepackage{xparse}

\ExplSyntaxOn\makeatletter

% @@ = mymodule

\dim_new:N \l_@@_bar_width_dim

\dim_new:N \l_@@_x_dim
\dim_set:Nn \l_@@_x_dim { 8mm }

\fp_new:N \l_@@_last_machine_row_x_fp

\NewDocumentCommand { \BarA } { m } {
   \fp_add:Nn \l_@@_last_machine_row_x_fp { 1.5 }% arbitrary value
   \dim_set:Nn \l_@@_bar_width_dim {
      \fp_to_dim:n {
         (#1 - \l_@@_last_machine_row_x_fp)
         *
         \l_@@_x_dim
      }
   }
   \rule { \l_@@_bar_width_dim } { 1ex }
}
\NewDocumentCommand { \BarB } { m } {
   \fp_add:Nn \l_@@_last_machine_row_x_fp { 1.5 }% arbitrary value
   \dim_set:Nn \l_@@_bar_width_dim {
      (#1 - \l_@@_last_machine_row_x_fp)
      *
      \l_@@_x_dim
   }
   \rule { \l_@@_bar_width_dim } { 1ex }
}

\ExplSyntaxOff\makeatother

\begin{document}
\BarA{5}% arbitrary value

\BarB{15}% arbitrary value
\end{document}

我想知道为什么\fp_to_dim:n在这种情况下我需要,因为\l_@@_x_dim已经是一个维度乘以一个无单位值(#1 - \l_@@_last_machine_row_x_fp)

我的示例代码取自我目前正在开发的包,显然它本身没有多大意义;-)

答案1

如果我尝试

\fp_set:Nn \l_tmpa_fp { 3.14 }
\cs_show:N \l_tmpa_fp

我明白了

> \l_tmpa_fp=macro:->\s__fp \__fp_chk:w 10{1}{3140}{0000}{0000}{0000};.

这表明\l_tmpa_fp不适合在 的上下文中使用<dimension expression>。顺便说一句, 的标准含义\s__fp\relax,只要它显示了您尝试这样做时出现错误的原因,它就很重要。

模块中的函数fp是为了确保可扩展性而制作的,但是其副作用是不简单地存储一个数字;想想0.1234e-12你不能在你想要的上下文中简单地使用表达式的情况。

另一方面,\fp_to_decimal:n返回给定参数的十进制表示形式<floating point expression>,可用作维度表达式前面的因子。

我会谨慎地\l_@@_x_dim在浮点表达式中使用,即使它会产生相同的结果:它们是不同的动物。存在\dim_to_fp:n转换。

相关内容