我尝试在维度计算中使用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
转换。