我可以内联调用 mdoc 宏吗?

我可以内联调用 mdoc 宏吗?

尽管 troff 有很多便利mdoc,但我发现与其他语言相比,troff 的语法仍然有点过于换行或“意大利面条”。考虑这个例子:

.Sh DESCRIPTION
The
.Nm
utility extracts C interface descriptions from a header file composed
using the SQLite documentation syntax (see
.Sx SYNTAX ) .
It then emits the corresponding set of
.Xr mdoc 7
manpages, one per interface description.
By default,
.Nm
reads from standard input and outputs files into the current directory.
Its arguments are as follows:

开始一个列表的段落的所有这些行对我来说很奇怪。有没有办法内联调用宏?


我尝试过使用字符串语法来调用宏,因为 groff 的手册指出字符串、转移和宏存储在共享名称空间中。这确实让我有所收获,但是.if条件在宏的开头最终未加工并生吃。

.Sh DESCRIPTION
The \*[Nm] utility extracts C interface descriptions from a header file composed
using the SQLite documentation syntax (see \*[Sx SYNTAX]).
It then emits the corresponding set of \*[Xr mdoc 7] manpages, one per interface
description. By default, \*[Nm] reads from standard input and outputs files into
the current directory.
Its arguments are as follows:

然后我尝试添加另一个字符串定义来插入换行符。.ds n \!不太有效,我最终得到的是一种消遣:

.box n
\!
.box

.Sh DESCRIPTION
The \*n\*[Nm] utility extracts C interface descriptions... (see \*n\*[Sx SYNTAX]).
It then...

现在.if垃圾邮件消失了,但不幸的是我在输出中得到了一个杂散的实际换行符。有没有更完美的方式来调用这些宏? (我们稍后会考虑 mandoc 兼容性。)

附录:

  • 添加“see SYNTAX”位后,换行符似乎在某种程度上是宏固有的.Nm,因为.Sx换行符只产生一个杂散的尾随空格。不过,我们能摆脱两者吗?
  • 如果我删除之后的空格\*n\*[Nm],多余的换行符就会消失,但这在源代码中看起来很奇怪。SYNTAX通过像原来那样调用来改进这个,\n*[Sx Syntax ) .]但它也会以某种方式产生段落中断。

答案1

我建议编写一个sed脚本来执行此操作。

例如,对于eqn,我有一个脚本 ,myeqn要转换.EA.EN\n.EQ

#!/bin/sed -f

s/^\. *EA\(.*\)$/.EN\n.EQ \1/g

然后我运行这个:

myeqn < file.ms | groff -e -ms > main.ps

如果需要,您可以使用 Makefile 自动执行此操作。

PS Groff 中的换行符需要习惯,但过了一段时间你就会开始欣赏它们。

相关内容