Groffを使用して算術演算を実行することは可能ですか?
現在のページを計算したいとします。現在は2ページにいます。次のページを使用して次のページの番号を取得できます。
.PP
Next page is number \n[.pn]
これはNext page is number 3
としてコンパイルされます。
代わりに算術演算を実行してレンダリングするにはどうすればよいですか?
.PP
Current page is ((\n[.pn]-1))
Current page is 2
に?
現在のページ番号は\n%
です。
算術式の結果を補間するには、最初に数値レジスタに入れる必要があると思います。
これは、式を引数として取り、その結果を__
という名前の(おそらく未使用の)レジスタに割り当て、レジスタの内容を補間するマクロ(徹底的にテストされていない)です。
Current page is \n%.
.br
.\" EI - eval and interpolate
.\" $1 is an expression to evaluate
.\" $2 (optional) is a string to append to the interpolated expression,
.\" without any intervening whitespace
.de EI
.nr __ \\$1
\&\\n(__\\$2
..
.nr x 4
4 times 3 minus 5 is
'EI (\nx*3-5)
\&.
.br
Here there's no space before the period:
'EI (\nx*3-5) .
.br
Nroffを実行した後:
Current page is 1.
4 times 3 minus 5 is 7 .
Here there's no space before the period: 7.
これは非常に一般的なことのように思われるので、標準のマクロパッケージにすでに含まれているようなマクロがあるかもしれませんが、私にはわかりません。
はい、groff
は算術演算を実行できます。これは、オンラインまたはGNU Info形式(完全なマニュアルを表示するにはinfo groff
またはpinfo groff
を使用)で入手できる完全なgroffマニュアルに記載されています)... 。多くのGNUプログラムと同様に、manページは単なるクイックリファレンスであり、完全なドキュメントは情報形式です。
から https://www.gnu.org/software/groff/manual/html_node/Expressions.html
gtroffには、他の言語に共通するほとんどの算術演算子があります。
- 算術:「+」(加算)、「-」(減算)、「/」(除算)、「*」(乗算)、「%」(モジュロ)。
gtroffは整数演算のみを提供します。結果の計算に使用される内部型は「int」で、通常は32ビットの符号付き整数です。
比較: '<'(より小さい)、 '>'(より大きい)、 '<='(以下)、 '> ='(以上)、 '='(等しい)、 '== '(' = 'と同じ)。
論理:「&」(論理および)、「:」(論理または)。
単項演算子:「-」(否定、つまり符号の変更)、「+」(完全を期すため、式では何もしません)、「!」(論理的ではありません。これはifおよびwhileリクエスト内でのみ機能します)。モーションリクエストでの単項演算子の使用については、以下を参照してください。
上記のように、論理否定演算子は、ifおよびwhile要求内でのみ機能します。さらに、式の先頭にのみ表示され、式全体を無効にする場合があります。
式内に「!」演算子を挿入しようとすると、「数値式が必要です」という警告が表示されます。これにより、古いバージョンのtroffとの互換性が維持されます。
例:
.nr X 1 .nr Y 0 .\" This does not work as expected .if (\n[X])&(!\n[Y]) .nop X only . .\" Use this construct instead .if (\n[X]=1)&(\n[Y]=0) .nop X only
ところで、info
は標準のGNU情報ドキュメントビューアです。 pinfo は、より「ブラウザのような」UIを提供する代替ビューアです。 lynx
のようなテキストウェブブラウザ。私は個人的にinfo
に耐えられず、代わりにpinfo
を使用します。ほとんどのディストリビューションにあらかじめパッケージ化されており、ソースコードはpinfoで入手できます。上記のリンク。