mdoc マクロをインラインで呼び出すことはできますか?

mdoc マクロをインラインで呼び出すことはできますか?

には多くの利便性があるにもかかわらず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 の互換性については後で検討します。)

補遺:

  • 「構文を参照」ビットが追加されると、改行はマクロに何らかの形で固有のものであるように見えます.Nm。これは、.Sx1 つの改行によって、末尾に余分なスペースが生成されるだけだからです。それでも、両方を削除することはできますか?
  • の後のスペースを削除すると\*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 の改行には慣れが必要ですが、しばらくするとその便利さがわかってきます。

関連情報