如何让nroff/troff宏对多行参数全部应用加粗格式?
修复troff多行参数宏的问题
问题根源在于troff会把宏参数中的换行符当作参数分隔符:你用\*[t1]传入的多行内容被拆成了多个参数,而原宏MMM只处理第一个参数$1(也就是aaa),剩下的bbb等内容会在宏执行完.ft R之后才输出,因此没被加粗。
以下是几个可行的修复方案:
方案1:让宏直接处理diversion(最可靠)
修改宏定义,让它直接输出指定diversion的内容,彻底避免参数传递带来的拆分问题:
.\" Start a diversion to capture text .di t1 aaa bbb .di .\" 定义宏:直接输出指定diversion的内容并加粗 .de MMM .ft B .di \$1 \" 输出目标diversion的内容 .di \" 关闭diversion输出模式 .ft R .. .\" 调用宏,传入diversion名称即可 .MMM t1
方案2:修改宏处理所有参数
如果坚持要用参数传递的方式,把宏改成处理全部传入参数($@代表所有参数),这样即使内容被拆分成多个参数,也能全部包裹在加粗字体范围内:
.\" Start a diversion to capture text .di t1 aaa bbb .di .\" 修改宏,处理所有传入参数 .de MMM .ft B $@ .ft R .. .asciify t1 .MMM \*[t1]
方案3:用引号包裹参数(部分troff版本支持)
部分troff版本允许用双引号将多行内容括起来,强制作为单个参数传递,此时原宏定义无需修改:
.asciify t1 .MMM "\*[t1]"
其中方案1的兼容性和效果最好,能完美保留原内容的换行、空行格式。
内容的提问来源于stack exchange,提问作者RandomB
相关产品推荐
相关产品推荐

