格罗夫算术

格罗夫算术

是否可以使用 groff 进行算术运算?
假设我想计算当前是哪一页,而我当前在第 2 页。我可以使用以下方法获取下一页的页码:

.PP
Next page is number \n[.pn]

它将编译为Next page is number 3.

我怎样才能执行算术来渲染:

.PP
Current page is ((\n[.pn]-1))

进入Current page is 2

答案1

当前页码是\n%

要插入算术表达式的结果,我认为您需要首先将其放入数字寄存器中。

这是一个宏(未经过详尽测试),它采用表达式作为参数,将结果分配给名为 的(可能未使用的)寄存器__,然后插入寄存器的内容。

Current page is \n%.
.br
.\" EI - eval and interpolate
.\" $1 is an expression to evaluate
.\" $2 (optional) is a string to append to the interpolated expression,
.\"    without any intervening whitespace
.de EI
.nr __ \\$1
\&\\n(__\\$2
..
.nr x 4
4 times 3 minus 5 is
'EI (\nx*3-5)
\&.
.br
Here there's no space before the period:
'EI (\nx*3-5) .
.br

运行完 nroff 后:

Current page is 1.
4 times 3 minus 5 is 7 .
Here there's no space before the period: 7.

这似乎是一件很常见的事情,标准宏包中可能已经有一个类似的宏,但我不知道。

答案2

是的,groff可以进行算术运算。这记录在完整的 groff 手册中,可以在线获取或以 GNU Info 格式获取(使用info groffpinfo groff查看完整手册)...与许多 GNU 程序一样,手册页只是一个快速参考,完整的文档是以信息格式。

https://www.gnu.org/software/groff/manual/html_node/Expressions.html

gtroff 具有大多数其他语言通用的算术运算符:

  • 算术:“+”(加法)、“-”(减法)、“/”(除法)、“*”(乘法)、“%”(模)。

gtroff 仅提供整数运算。用于计算结果的内部类型是'int',通常是32位有符号整数。

  • 比较:'<'(小于)、'>'(大于)、'<='(小于或等于)、'>='(大于或等于)、'='(等于)、'== '(与'='相同)。

  • 逻辑:'&'(逻辑与)、':'(逻辑或)。

  • 一元运算符:“-”(求反,即更改符号)、“+”(只是为了完整性;在表达式中不执行任何操作)、“!” (逻辑不是;这只适用于 if 和 while 请求)。请参阅下文了解运动请求中一元运算符的使用。

如上所述,逻辑 not 运算符仅在 if 和 while 请求中起作用。此外,它可能只出现在表达式的开头,并对整个表达式求反。

尝试插入“!”表达式中的运算符会导致“需要数字表达式”警告。这保持了与旧版本 troff 的兼容性。

例子:

.nr X 1
.nr Y 0
.\" This does not work as expected
.if (\n[X])&(!\n[Y]) .nop X only
.
.\" Use this construct instead
.if (\n[X]=1)&(\n[Y]=0) .nop X only

BTW,info是标准的 GNU Info 文档查看器。 个人信息是另一种查看器,它提供了更“类似浏览器”的 UI,类似于lynx.我个人无法忍受info并使用pinfo它。它可以为大多数发行版预先打包,源代码可以在上面的 pinfo 链接中找到。

相关内容