在浏览了网站上的各种答案并查看了的文档后e-tex
,我仍然想知道在各种类型的表达式中到底允许什么,\numexpr
即\dimexpr
和\glueexpr
。
更确切地说,我对实数除法和乘法的放置位置感兴趣。例如,是否允许\dimexpr 12pt / 2.3pt\relax
或允许类似操作?如果有人能解释此类表达式的形式语法,那将很有帮助。
答案1
四个表达式原语(\numexpr
、\dimexpr
、\glueexpr
、\muexpr
)可以在任何可以使用相同类型寄存器的地方使用。这意味着\numexpr
产生整数、\dimexpr
产生维度、\glueexpr
产生胶合表达式并\muexpr
产生 muskip 值。因此,类似于问题中的例子
\the\dimexpr 12pt / 2.3pt\relax
不能得到实数作为结果有成为一个维度。(正如我们将在下面看到的,这里的结果6pt
后面跟着.3pt\relax
。)(我在这里添加了\the
,这样您就可以排版结果,而不必在作业中使用它。我会一直这样做。)
在所有情况下,正式语法是表达式吸收标记并执行适当的数学运算,直到\relax
输入中的 a 或第一个无效标记。这最容易通过 看到\numexpr
,它必须产生一个整数。例如
\the\numexpr 2 + 2pt
将打印4pt
,它由表达式 ( ) 的结果4
和后面不能成为表达式一部分的输入组成,因此终止表达式。这在比较中很有用,比较器必然会终止表达式
\ifnum\numexpr ... > \numexpr ... \relax
对于\dimexpr
和\glueexpr
,形式语法要求输入由一个维度(或粘合值)后跟一个可选的乘法因子组成,而不是相反。因子本身可以是一个数值表达式。因此
\the\dimexpr 1pt + 1pt\relax
\the\dimexpr 1pt * 10\relax
\the\dimexpr (1pt + 1pt) / (1 + 1)\relax
是有效的,并给出了预期的结果,但是
\the\dimexpr 10 * 1pt\relax
无效并会导致错误。
表达式可以使用运算符+
、-
和*
以及/
括号(
/ )
。除法会进行四舍五入,这适用于维度/胶水表达式中的任何数字表达式。因此,例如,我们得到
\the\dimexpr 5pt * (3 / 2) \relax % 10pt
\the\dimexpr 5pt * (4 / 3) \relax % 5pt
在胶合表达式中,加/减部分不需要括号来受因子影响,因为它们必然是一个实体。例如
\the\glueexpr 5pt plus 1pt * 2 \relax
产量10pt plus 2pt
。
在表达式中,TeX 会将其他数值类型强制转换为正确的形式,就像执行寄存器赋值时一样。因此
\the\numexpr\dimexpr 1pt\relax\relax
将导致65536
,IE的值1pt
转换为缩放点,然后强制转换为整数。在\glueexpr
这里,拉伸/收缩将被删除。反过来,或\numexpr
中的任何内部都需要适当的单位来提供\dimexpr
\glueexpr
\the\dimexpr\numexpr 1 + 2\relax pt\relax