groff 寄存器在宏期间未定义

groff 寄存器在宏期间未定义

语境:

假设我正在尝试在 groff 中编写一个宏,以便在给定一些参数(例如宽度和高度)的情况下绘制一个矩形。为此,我需要执行一些简单的算术,我想将其存储在寄存器中以提高可读性。

如何重现

在任何普通的 groff 文档中我都可以使用:

.nr a 1  \"creates a number register with the name a and the value 1
\n[a]      \"prints the content of register a

它打印1在文档上但是当我将它放在宏中MACRO并像这样调用它时:

.de MACRO  \"defines a new macro with name MACRO
.nr a 1    \"creates a number register with the name a and the value 1
\n[a]        \"prints the content of register a
..         \"end of MACRO definition
.MACRO     \"calls MACRO

0根据文档(man groffman 7 groffinfo groff),它会打印,这是新寄存器的默认值。

它是如何编译的

我使用这个脚本编译它:

groff -kep "$file" -Tpdf > "$file.pdf"

我做错了什么?在宏内使用寄存器是否可行?我该怎么做?

答案1

是的,可以在宏内部使用寄存器,但是您必须告诉 troff 在宏运行时等待评估要评估的值被称为, 代替定义的

因此,您必须在宏定义中转义询问寄存器值的行前面的反斜杠,以

.de MACRO  \"defines a new macro with name MACRO
.nr a 1    \"creates a number register with the name a and the value 1
\\n[a]       \"prints the content of register a
..         \"end of MACRO definition
.MACRO     \"calls MACRO

这样,宏中给定的值就会被打印出来,所以1在这种情况下。

相关内容