语境:
假设我正在尝试在 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 groff
、man 7 groff
和info 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
在这种情况下。