\dimexpr \numexpr \glueexpr 的形式语法规则

\dimexpr \numexpr \glueexpr 的形式语法规则

在浏览了网站上的各种答案并查看了的文档后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

将导致65536IE的值1pt转换为缩放点,然后强制转换为整数。在\glueexpr这里,拉伸/收缩将被删除。反过来,或\numexpr中的任何内部都需要适当的单位来提供\dimexpr\glueexpr

\the\dimexpr\numexpr 1 + 2\relax pt\relax

相关内容