グローブ演算

グローブ演算

算術演算に 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

答え1

現在のページ番号はです\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.

これは一般的なもののようで、標準マクロパッケージにはすでに似たようなマクロがあるかもしれませんが、それについてはよくわかりません。

答え2

はい、groff算術演算を実行できます。これは、オンラインまたはGNU Info形式で提供されている完全なGroffマニュアルに文書化されています(完全なマニュアルを使用または参照してくださいinfo groffpinfo groff...多くのGNUプログラムと同様に、マニュアルページは簡単な参照であり、文書全体はinfo形式です。

~からhttps://www.gnu.org/software/groff/manual/html_node/Expressions.html

gtroffには、他のほとんどの言語に共通の算術演算子があります。

  • 算術: 「+」(プラス)、「-」(減算)、「/」(除算)、「*」(乗算)、「%」(モジュロ).

gtroffは整数演算のみを提供します。計算結果に使用される内部タイプは 'int'で、通常32ビット符号付き整数です。

  • 比較: '<'(より小さい)、'>'(より大きい)、'<='(小さいか等しい)、'>='(大きいか等しい)、'='(等しい)、'=='( '='同じ).

  • 論理: '&'(論理AND)、 ':'(論理OR)。

  • 単項演算子: "-"(否定、すなわち符号変更)、"+"(完全性のために、式で何もしない)、"!"(論理的でない、ifおよびwhile要求にのみ適用される)演算子の使い方は下記をご覧ください。

前述のように、論理 not 演算子は 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 Infoドキュメントビューアです。 個人情報次のような「ブラウザに似た」UIを提供する別のビューアですlynx。個人的に耐えられないのでinfo使えpinfoません。ほとんどのディストリビューションでは事前パッケージとして提供されており、ソースコードは上記のピンポリンクにあります。

関連情報