尽管 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 中的换行符需要习惯,但过了一段时间你就会开始欣赏它们。