如何在groff中将宏参数赋值给数字寄存器?
troff数字寄存器在宏中无法正常取值的问题
问题现象
直接使用数字寄存器时运行正常:
.nr weeks 12 .tm start is \n[weeks] weeks away.
控制台会输出预期的start is 12 weeks away.。
但将逻辑移入自定义宏后,结果不符合预期:
.de set_weeks . nr weeks \\$1 . tm start is \n[weeks] weeks away. ..
调用宏时:
.br .set_weeks 6 .br
控制台输出start is 0 weeks away.,而非预期的start is 6 weeks away.。
问题原因
troff在定义宏时会提前解析宏体内的转义序列。当你在宏里写\n[weeks]时,宏定义阶段weeks寄存器还未被当前宏的.nr命令赋值(此时寄存器值为默认的0),所以这个转义序列会被直接替换成0,而不是等到宏调用执行时再去读取寄存器的最新值。
解决方案
需要延迟转义序列的解析时机,让\n[weeks]在宏调用执行时才被解析。只需在宏定义里给\再加一层转义,写成\\n[weeks]:
.de set_weeks . nr weeks \\$1 . tm start is \\n[weeks] weeks away. ..
再次调用.set_weeks 6,控制台就会输出正确的start is 6 weeks away.。
内容的提问来源于stack exchange,提问作者DaveParillo
相关产品推荐
相关产品推荐

