是否可以使用 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 groff
或pinfo 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 链接中找到。