GROFF(7)

名前
groff - GNU groff 言語の簡易リファレンス

説明
groff とは GNU roff の事であり、roff 組版システムのフリーな実装である。 groff システムの概観と背景については roff(7) を参照のこと。

このドキュメントでは、groff で使われる定義済みの roff 言語要素を 簡潔に説明する。 伝統的な機能と groff の拡張との双方を取り扱う。

歴史的に、 roff 言語 は troff と呼ばれていた。 groff は伝統的なシステムと互換性があり、固有の拡張も提供している。 そのため GNU 版では、 roff, troff, gorff 言語 という用語は同義語として扱われている。 しかし、どちらかといえば troff は伝統的な側面を表すときに、 groff は GNU の拡張を強調するときに、 roff は一般的な言語を意味するときに使われる傾向がある。

このファイルは完全なドキュメントである groff info(1) ファイルの簡易版である。info ファイルには、より詳細で、実情に近く、 分かりやすい情報が含まれている。

groff ドキュメントを書くための通常の文法は比較的易しいが、 roff 言語を拡張する書き方は多少難しいかもしれない。

roff 言語は行指向である。 行には、制御行とテキスト行の 2 種類しかない。 制御行は制御文字で始まり、制御文字とはデフォルトではピリオド かシングルクォート である。それ以外で始まる行はすべてテキスト行である。

制御行 はコマンドを表し、コマンドは引き数をとる場合もある。 これらの行は次のような文法となる。 まず先行する制御文字に続いてコマンド名、それから必要なら引き数がそれぞれ空白で 区切られる。例をあげると以下のとおり。

    .command_name arg1 arg2

インデント用に、スペース文字・タブ文字を制御文字とコマンド名との間にいくつでも 挿入できる。しかし、制御文字は必ず行の先頭に置かなければならない。

テキスト行 は、表示される部分を表す。 これらの行は、エスケープシーケンスによって修飾することができる。 バックスラッシュ からはじまる文字列がエスケープシーケンスとして認識される。 これらは行や単語の一部に含まれ、整形要素となったり関数となったりする。 エスケープシーケンスには引き数をとるものもあり、 引き数はシングルクォート で区切られる。 他には、開き括弧 で始まる長さ規定で制御されるものや、カギ括弧 と で括られるものがある。

roff 言語は、マクロのような言語の拡張を記述するための柔軟な手段を提供している。 マクロ定義を処理するときには、roff システムは コピーモード と呼ばれる特別な処理モードへと切り替わる。

コピーモードのふるまいは実に巧妙である。 しかし、安全な使用法を保証するいくつかのルールがある。

1.  表示するためのバックスラッシュは と表記しなければならない。 より正確に言うなら、 は現在のエスケープ文字を意味する。 バックスラッシュのグリフが必要ならば、 を用いること。

2.  すべてのバックスラッシュを 2 回繰り返しておく。

3.  すべてのテキスト行を特別な非空白文字である で開始する。

このやり方は一番効率的なコードができるというわけではないが、当初の目的は達成できる。 より良い方法のためには、groff info ファイルと groff_tmac(5) を参照してほしい。

roff ソースファイルを読むのは簡単である。 単に、すべてのマクロ定義部分にある 2 重になったバックスラッシュを 1 つに 置き換えるだけである。

GROFF 要素
roff 言語の要素はテキストファイルに整形情報を追加する。 基本的な要素は定義済みのコマンドと変数であり、これらがあるので roff は成熟したプログラミング言語となっている。

roff コマンドには 2 種類あり、可能ならば引き数をとることもできる。 リクエスト は、ドット か で始まる 1 行に記述される。 一方、 エスケープシーケンス は行埋め込み式の関数であり、バックスラッシュ で始まる単語整形要素である。

リクエスト を使うと、ユーザは自分専用の整形コマンドを定義することができる。 これらのコマンドは マクロ と呼ばれるが、リクエストとまったく同じように使われる。 マクロパッケージは groff 言語で記述された定義済みマクロの集まりである。 ユーザ独自のエスケープシーケンスを作る試みは非常に制限されており、 特殊文字のマップができる程度である。

groff 言語は、それぞれ使い方の異なる変数を何種類か提供している。 定義済みの変数もあるが、ユーザは独自の変数を定義することもできる。

文字列 変数は文字のシーケンスを格納する。これらはリクエスト によって値を設定し、エスケープシーケンス によって値が取り出される。

レジスタ 変数は、数値、単位付きの数字、そして場合によっては文字列のようなオブジェクトを 格納できる。 これらは、リクエスト によって値を設定し、エスケープシーケンス によって値が取り出される。

環境 には、ユーザが後から再利用するために、行の長さやフォントサイズといった グローバルな整形用パラメータを一時的に格納することができる。 これは、リクエスト によって行われる。

フォント は、名前でも内部的な番号ででも指定できる。 現在のフォントは、リクエスト かエスケープシーケンス によって選ぶことができる。 デバイスごとに固有のフォントがあるが、以下のフォントはすべてのデバイスで 有効である。 R は標準のローマン体フォントである。 B はローマン体の ボールド表示 である。 I は イタリック体 フォントである。 イタリックはどのデバイスでも使用できるが、 テキストデバイスではアンダーライン付きの ローマン体フォントで表示される。 グラフィック出力デバイスでは、上記のフォントに対応する固定幅フォントもある。 それぞれ、 CR・CB・CR である。 テキストデバイスでは、どのみちすべての文字は固定幅になる。

さらに、いくつかの拡張された roff 要素がある。 ディバージョン は後で使うための情報をマクロ内部に格納する。 トラップ は位置条件であり、ページ先頭からの特定の行番号とか、 ディバージョンや入力における特定の行番号などのかたちで指定される。 いくつかの動作を、条件を満したときに自動的に実行されるように指示することができる。

より詳細な情報は groff info ファイルに示されている。

制御文字
ある条件下において、特別な制御機能を持つ文字がいくつかある。

ドットは、行の先頭にある場合と、以下のリクエスト (
    の後にある場合には特別な意味を持つ。 これらの場合では、ドットはリクエスト (またはマクロ) の開始を意味する 制御文字となる。 この特殊な働きは のようにエスケープすることで抑制できる。 リクエスト を用いると、この制御文字を別の文字に割り当てることができる。 この時、ドット は制御文字ではなくなる。

    他の場所にある場合は、ドットは単にドット文字そのものを意味する。 テキストの段落においては、各センテンスを 1 行に書くと都合が良い。

シングルクォートには 2 つの制御機能がある。
    行の先頭にある場合と、条件つきリクエストに続く場合には、非改行制御文字を意味する。 つまり、この文字はドットと同じようにリクエストの開始を意味するが、 それに加えて改行を行わないという特性がある。 リクエスト を用いると、この非改行制御文字を別の文字に割り当てることができる。

    2 つめの機能としては、エスケープシーケンスにおいて引き数の 区切り文字としてよく使用される (ただし、引き数の一部になっていない 文字の対であればどれでも区切り文字として機能する)。 これら以外の場所にある時は、シングルクォート文字またはアポストロフィ文字を意味する。 groff はこの文字の表示用の表現手段としてエスケープシーケンス を提供している。

"   ダブルクォートは、リクエストやマクロの引き数を括る時に使用される。 エスケープされたダブルクォート \" はコメントの開始を意味する。 それ以外の場合は、特別な機能はない。 groff はこの文字の表示用の表現手段としてエスケープシーケンス を提供している。

バックスラッシュは、通常はエスケープシーケンスの開始を意味する
    (リスエスト によって変更することができる)。 表示用のエスケープ文字は、エスケープシーケンス であり、バックスラッシュのグリフは で得られる。

開き括弧は、エスケープシーケンスの内部で特別な意味を持つ。
    ちょうど 2 文字からなるエスケープシーケンス名や引き数の開始を意味する。 groff では、この動作は [] の組で置き換えることができる。

開き角括弧は、groff の場合エスケープシーケンス内部で特別な意味を持つ。
    これは、長いエスケープシーケンス名や長いエスケープシーケンス引き数の 開始を意味する。 それ以外では、例えばマクロ呼び出しなどでも特別な作用はない。

閉じ角括弧は groff のエスケープシーケンスにおいて特別な意味を持つ。
    これは、長いエスケープシーケンス名や長いエスケープシーケンス引き数の終了を 意味する。 それ以外では、特別な作用はない。

space
    空白 (space) 文字は機能的な働きしか持たない文字である。 これは、リクエストやマクロの引き数の区切り文字であり、 テキスト行における単語の区切りである。 また、groff の水平方向の語間計算の作用対象となる。 定義された空白幅を得るには、 (エスケープ文字とそれに続く空白文字)、 といったエスケープシーケンスを用いればよい。

newline
    テキストの段落においては、改行 (newline) は空白文字と同じような作用をする。 行が連結しているものとみなすには、改行をエスケープすることで指定できる。 つまり、行の最後の文字としてバックスラッシュ を記述する。

tab テキスト中にタブ文字があれば、インタプリタは次の定義済みのタブ位置へと 水平方向のインデントを作りだす。 タブ位置の調整には洗練されたインターフェースがある。

数式
数値 とは、単位指定子の付加されていない 符号付き整数・符号なし整数・浮動小数点実数、 およびそれに単位指定子の付加されたものである。 単位指定子 とは、計測単位を表す 1 文字の略語である。 単位が後置された数値は、サイズに関する値である。 デフォルトでは数値は単位指定を持たない。つまり、単なる数字である。

roff 言語は、以下のような単位を定義している。

c | センチメートル
i | インチ
P | パイカ 1/6 インチ
p | ポイント 1/72 インチ
m | Em フォントサイズ (文字 `m` の幅)
M | Em の 100 倍
n | En Em/2
u | 実際の出力デバイス用の基本単位
v | 基本単位による行送り幅
z | スケールされたポイント数 1/sizescale (フォントの DESC ファイルで定義されている)

数式 は、上記の数値と算術演算子 (剰余)、 比較演算子 ( と同じ), 論理演算子 (論理積), (論理和), (論理否定)、 および括弧 の組み合わせである。

さらに、 grof には数式に以下の演算子が追加された:

e1>?e2 | Ie1 と e2 の最大値
e1<?e2 | e1 と e2 の最小値
(c;e) | c をデフォルトの単位指定子として e を評価する

詳細は groff の info ファイルを参照のこと。

条件式
条件式 は、リクエスト によって生じる条件判定である。 以下の表に、いろいろな条件式を示す。

N | 数式 N は値が 0 より大きければ真を返す。
!N | N の値が 0 以下であれば真。
's1's2' | 文字列 s1 と文字列 s2 が等しければ真。
!'s1's2' | 文字列 s1 と文字列 s2 が等しくなければ真。
cch | 文字 ch が有効であれば真。
dname | name という文字列・マクロ・ディバージョン・リクエストが存在すれば真。
e | 現在のページ番号が偶数なら真。
o | 現在のページ番号が奇数なら真。
n | フォーマッタが nroff なら真。
rreg | reg というレジスタがあれば真。
t | フォーマッタが troff なら真。

リクエスト
このセクションでは、定義済みのリクエストについての短いリファレンスを 提供する。 groff では、リクエストとマクロの名前は任意の長さをとることができる。 長い名前に対して括弧で括ったりマークを付けたりする必要はない。

たいていのリクエストは、ひとつまたは複数の引き数を持つ。 引き数は空白文字で区切られる (タブ文字は不可)。 その長さや数に制限はない。 引き数はダブルクォートで括ることができる。 これは、引き数に空白文字が含まれるときにとても便利である。 例えば、 "arg with space" はひとつの引き数を意味する。

いくつかのリクエストは、動作を修正するためのオプション引き数を持つ。 それらの詳細はここでは説明しない。 詳細は、groff の info ファイルを参照のこと。

後述するリクエストの説明では、多くの引き数の名前は意味を表すように選んである。 下に挙げた用語についてはその意味を示す。

c | 1 文字を意味する。
font | 名前または番号で指定されたフォント。
anything | 行末までのすべての文字、または \{ と \} で 括られた文字。
n | 整数値を返す数式。
N | 符号付きまたは符号なしの任意の数式。
±N | 以下に説明するように符号に応じて 3 つの意味がある。

で定義された式が 符号で始まる場合は、式の結果の値は関連するすでに存在するリクエストに固有の 値に対して加算される。例えば、数値レジスタに追加される。 式が で始まる場合は、式の値がリクエストの値から減算される。

符号が無い場合は、 は既存の値を直接置き変える。 負の値を指定する場合には、0 を前置するか負数を括弧で括ればよい。

  リクエストの簡易リファレンス
空行 (無視される)。ドキュメントの整形に便利。 行全体がコメントとなる。 を標準エラーに出力しプログラムを終了する。 現在の位置ぞろえモードで出力行の位置ぞろえを開始する。 位置ぞろえモード で行を開始する。 (cl,r,b,n) フォーマット をレジスタ に割り当てる。 (cl,i,I,a,A) レジスタ の別名 を作成する。 リクエストや文字列、マクロ、ディバージョンなどのオブジェクト の別名 を作成する。 が呼ばれるまでをマクロ に追加する。 が呼ばれるまでをマクロ に追加する。 文字列 を文字列変数 に追加する。 ディバージョン に含まれる特殊 ASCII 文字を整形しない。 入力のバックトレースを標準エラー出力に出力する。 フォント を 単位に強調する。 現在のフォントが のときにスペシャルフォント で強調する。 現在のページを終了して新しいページを開始する。 現在のページを終了する。次のページ番号を にする。 空白行を意味するマクロを に設定する。 改行。 while ループを終了する。 非改行制御文字を に戻す。 非改行制御文字を に設定する。 制御文字を に戻す。 制御文字を に設定する。 次の入力行をセンタリングする。 以下の 行の入力行をセンタリングする。 ファイル の内容をそのまま標準出力またはディバージョンへコピーする。 のモード番号に従って、文字 を扱う。 の場所を に変更する。 文字列 を文字 と定義する。 マクロ、文字列、ディバージョンなどの の最後の 1 文字をとりのぞく。 ストリーム をクローズする。 while ループにおける現在の繰り返し処理を終了する。 互換モードを有効にする。 N が 0 なら互換モードを無効にする。それ以外なら有効にする。 フォント の固定ピッチ文字幅を に設定する。(単位は全角文字幅 nroff の場合の連続アンダーライン。 troff のリクエスト に相当する。 マクロ を転換・追加する。 リクエスト が呼ばれるまでマクロ を定義 (再定義) する。 リクエスト が呼ばれるまでマクロ を定義 (再定義) する。 現在のディバージョンを終了する。 マクロ にディバージョンする。 リクエスト を互換モードを有効にして解釈する。 文字列変数 に文字列 を設定する。 ディバージョンのトラップ位置を に設定する。 (デフォルトの単位指定子は エスケープ文字を に戻す。 エスケープ文字を に設定する。 if-else リクエスト (の else ブロック。 入力が終わった後にマクロ を実行する。 エスケープ文字の処理を抑制する。 直前の環境に変更する。 環境の番号または名前 をプッシュして切り替える。 環境 の内容を現在の環境にコピーする。 環境のプッシュまたはポップは行わない。 roff の処理を終了する。 現在のフォントファミリーを に設定する。 フィールド機構を無効にする。 フィールド区切りを に設定する。パディング文字をスペースにする。 フィールド区切りを に、パディング文字を に設定する。 出力行を埋める。 出力バッファをフラッシュする。 位置 にフォント をマウントする。 位置 にフォントを長い名前 から短い名前 にマウントする。 現在のフォントが の場合に、 をスペシャルフォントにする。 直前のフォントに戻す。 リクエスト と同じ。 フォント名または番号 に変更する。 エスケープシーケンス と同じ。 フォント をフォント に変換する。 追加したハイフネーション指定文字を削除する。 ハイフネーション指定文字 を追加する。 文字 のハイフネーションコードを に、文字 のコードを のように設定する。 現在のハイフネーション言語を に設定する。 ハイフンされた行の最大連続数を に設定する。 ハイフネーションのパターンをファイル から読み込む。 例外的なハイフネーションをする単語のリストを で指定する。 ハイフネーションモードを に変更する。 ハイフネーションのマージンを に設定する。 (デフォルトの単位指定子は ハイフネーションのスペースを に設定する。 条件式 が真ならば を処理する。偽の場合はリクエスト へ移動する。 条件式 が真ならば を処理する。偽の場合は何もしない。 リクエスト が呼ばれるまでテキストを無視する。 リクエスト が呼ばれるまでテキストを無視する。 直前のインデント量に変更する。 引き数 に従ってインデント量を変更する。 (デフォルトの単位指定子は 入力行のカウントトラップを位置 に設定する。 pairwise kerning を有効にする。 が 0 ならば pairwise kerning を無効にする。0 でなければ 有効にする。 先頭の繰り返し文字を取り除く。 先頭の繰り返し文字を に設定する。 文字列 の文字列長をレジスタ に書き込む。 入力する行数を に、ファイル名を に設定する。 引き数 が 0 より大きければリガチャ (合字) モードにする。 直前の行幅に変更する。 行幅を引き数 に従って設定する。 (デフォルトの設定は で、単位指定子は 追加の内部行スキップ量を直前の値に変更する。 追加の内部行スキップ量を に設定する。 つまり、テキストの出力行それぞれの後に 行の空白行を挿入する。 タイトルの長さ。(デフォルトの単位指定子は マージンの文字を無効にする。 それぞれのテキスト行の後と右側マージンの間に文字 を出力する。 マージン文字を に、右側マージンからの距離を に設定する。(デフォルトの単位指定子は 現在の垂直位置を にマークする。 リクエスト .so と同じだが、tmac ディレクトリにある file も検索される。 出力行の位置ぞろえを行わない。 1 行分の行送りが必要。 行分の行送りが必要。(デフォルトの単位指定子は 出力行にフィルタリングや位置ぞろえを行わない。 ハイフネーションをしない。 行番号モードを無効にする。 行番号モードの、行番号、行番号出力間隔、空白、インデントを設定する。 次の行に行番号をつけない。 次の 行に行番号をつけない。 レジスタの値を、インクリメント値 で に設定・変更する。 内部条件式 n を真に、 t を偽にする。 空白なしモードにする。 次のファイル。 ファイル を書き込みモードでオープンし、ストリーム名 に関連付ける。 リクエスト と同じだが、追加モードでファイルをオープンする。 リクエスト で指定された行送り量を出力する。 ページ番号文字を に戻す。 ページ番号文字を設定する。 プログラム に出力をパイプする。(nroff のみ) ページ長をデフォルトの に設定する。 現在のページ長はレジスタ に格納されている。 ページ長を に変更する。(デフォルトの単位指定子は マクロ名とサイズを出力する。(サイズは 1 ブロック 128 バイトのブロック数) マクロ全体のサイズだけを出力する。(サイズは 1 ブロック 128 バイトのブロック数) 次のページ番号を に設定する。 現在定義されている数値レジスタの名前と内容を標準エラー出力に出力する。 直前のページオフセットに変更する。現在のページオフセットはレジスタ に格納されている。 ページオフセットを に設定する。 直前のポイントサイズに戻す。 ポイントサイズを指定する。エスケープシーケンス と同じ。 PostScript 画像 のための矩形領域を得る。 リクエスト と同様だが、 の標準出力から入力する。 すべてのトラップの名前と位置を標準エラー出力に出力する。 (入力行のトラップとディバージョンのトラップは含まれない) 文字定義 を削除する。 挿入を読み込む。 次の 行の入力行を右寄せする。 で指定されたリクエスト、マクロ、文字列を削除する。 で指定されたリクエスト、マクロ、文字列の名前を に変更する。 レジスタ名 を に変更する。 レジスタ を削除する。 空白をもとに戻す。つまり空白なしモードを無効にする。 マークされた垂直位置まで大文字を返す。 (デフォルトの単位指定子は ハイフン文字を に戻す。 ハイフン文字を に設定する。 マクロにおいて、引き数を位置 にシフトする。 ソースファイルをインクルードする。 1 行スキップする。 の行送りを挿入する。 の符号によって上下方向が決まる。 (デフォルトの単位指定子は フォント 等はスペシャルフォントであり、現在のフォントにない文字をこれらから検索する。 空白文字のサイズを に設定する。単位は現在のフォントの空白幅。 空白文字のサイズを に、文の空白サイズを に設定する。単位は現在のフォントの空白幅 (1/3 em) 位置 のフォントをスタイル に関連付ける。 レジスタ の文字列の中の部分文字列 を に置き換える。 行送り量を に設定する。 リクエスト で出力される空白行の送り量を に設定する。 プログラム を実行する。 タブ位置を の倍数に設定する。 (デフォルトの単位指定子は 位置 ... , のタブ位置をそれぞれ ... に、さらにそれ以降を ... のように設定する。 タブ繰り返し文字を削除する。 タブ繰り返し文字を に設定する。 次の行を一時的にインデントする。 (デフォルトの単位指定子は フォント のトラックカーニングを有効にする。 3 つの部位をもつタイトル。 ファイル の内容をそのまま出力する。 をターミナル (UNIX の標準的なメッセージ出力先) に出力する。 出力で を に、 を に、のように変換する。 リクエスト と同じだが、 によってディバージョンへと出力されるテキストは変換されない。 内部条件式 t を真に、 n を偽に設定する。 アンダーライン付きのフォントを に設定する。 (リクエスト で切り替わる) 入力行を 行、アンダーライン付きにする。(troff では イタリック体になる) が 0 でなければ垂直位置のトラップを有効にする。 0 ならば無効にする。 直前の行送り幅に変更する。 行送りの基準となる間隔を に設定する。 デフォルト値は である。 警告コードを に設定する。 局所的なトラップを設定する。負の値の場合はページ末尾からになる。 条件式 が真ならば を入力として許可する。 ストリーム へ を書き込む。

これらの基本的な groff リクエストの他にも、マクロの呼び出しがある。 これらはマクロパッケージ (概要は roff(7) を参照) やプリプロセッサ由来のものである。

プリプロセッサマクロは認識しやすい。 これらは独特のマクロの対で括られている。

プリプロセッサ | 開始マクロ | 終了マクロ
eqn | .PS | .PE
grap | .G1 | .G2
grn | .GS | .GE
pic | .PS | .PE
refer | .R1 | .R2
soelim | なし | なし
tbl | .TS | .TE

エスケープシーケンス
エスケープシーケンスは行内の言語要素であり、通常はバックスラッシュ から始まりエスケープ名が続く。引き数が必要なものもある。 入力の処理は、エスケープされた文字や引き数の直後に連続し、 区切り文字はない。 したがって、エスケープ名や引き数の終了を決定する方法が必要である。

これには、名前 (エスケープ名や変数名を含む引き数) をカギ括弧の対で括ったり (例: 定数の引き数 (数値式や複数の文字) アポストロフィ (ASCII コード 0x27) で括ったり (例: 'constant') する 。

エスケープ名には短い名前の省略形がある。 2 文字のエスケープ名は開き括弧で指定される。 例として のようになり、閉じ括弧は必要ない。 そして、特別な文字である と 以外の、すべての 1 文字の名前は のようにマーカーなしで指定することができる。

長さが の定数の引き数もアポストロフィのマーカーを省略できるが、 2 文字の場合にはエスケープ名と同じような省略指定はできない。

1 文字のエスケープシーケンスは主に内部関数やシステムに関連した機能であり、 で構成される 2 文字名は roff システムで定義済みの特殊文字に使われる。 のような 2 文字より長い名前の場合は、たいていユーザが定義したものである。 (リクエスト を参照)

  1 文字のエスケープシーケンス
コメントの開始。行末までのすべてが無視される。 行末の改行文字までが無視される。 コピーモードとして処理される。 \" と似ているが行末の改行文字までが無視される。 文字列を 1 文字の名前の文字列変数 に格納する。 文字列を 2 文字の名前の文字列変数 に格納する。 文字列を任意の長さの名前の文字列変数 に格納する。 現在呼びだされているマクロの名前。リクエスト でマクロに 1 つ以上の名前をつけることができる。 番目のマクロの引き数。 は 1 から 9 までの数値。 2 桁の数値 で指定されるマクロの引き数。 番目のマクロの引き数。 ここで、 は 1 以上の整数を返す数式。 あるマクロにおける、すべての引き数をスペースで区切って連結した文字列。 あるマクロにおける、すべての引き数それぞれをダブルクォートで括り、 スペースで区切って連結した文字列。 1 文字のバックスラッシュに短縮される。 コピーモード時のエスケープ文字による処理を抑制するのに使われる。 表示可能なバックスラッシュには を使用する。 鋭音記号 ´ 。 と同じ。エスケープされない場合は、アポストロフィ、右引用記号、シングルクォート (ASCII コード 0x27) となる。 抑音記号 ` 。 と同じ。エスケープされない場合は、左引用記号、バッククォート (ASCII コード 0x60) となる。 現在のフォントにおける - 符号。 処理されないドット (ピリオド)。行頭の場合のみ。 デフォルトの省略可能なハイフン文字。 透過行指定子。 ディバージョンにおいて、 をディバージョンにそのまま埋め込む。 はコピーモードで読み込まれる。 エスケープシーケンス と も参照。 連結されない空白文字 (改行も行われない)。 数字の幅。 l/6 em の狭い空白文字。nroff では幅ゼロ。 1/12 em の狭い空白文字。nroff では幅ゼロ。 表示されないゼロ幅の文字。 と似ているが、cflags リクエストで宣言した文字のようにふるまい、 文の終りを明示するために使用される。 先行する文字との幅を増加し、この文字の後に続く文字がローマン体であるならば この文字と後に続く文字の間の空白は修正される。 後に続く文字との幅を調整し、この文字に先行する文字がローマン体であるならば この文字と先行する文字の間の空白は修正される。 改行の入らない空白で、行が調整されたときには通常の単語間の空白のように 引き延ばされる。 改行を無視して行を連結する。 条件入力の開始。 条件入力の終了。 2 文字の名前 の特殊文字。 特殊文字 のセクションを参照。 任意の長さの名前 の名前付き文字。 処理されない先行文字。 が文字列・マクロ・ディバージョン・レジスタ・環境・フォントのどれか の名前として有効であるならば 1 を、そうでなければ 0 を返す。 カギ括弧を構築する関数。 テキスト処理を中断する。 で呼ばれる文字。 と同じだが、他の roff システムと互換性がある。 1/2 em だけ行送りをする (nroff では 1/2 行)。 の文字で定義されたグラフィック要素を描画する。 詳細は groff info ファイルを参照のこと。 現在のエスケープ文字の表示可能なバージョン。 エスケープ文字と同じだが、コピーモードでは処理されない。 フォントを 1 文字名または 1 桁の数値 で指定されたものに変更する。 フォントを 2 文字名または 2 桁の数値 で指定されたものに変更する。 フォントを任意の長さの名前または数式 で指定されたものに変更する。 リクエスト に最適な という名前のレジスタのフォーマットを返す。 別の形式では、 と となる。 局所的な水平移動。右側へ だけ移動する。(負数のときは左側へ移動する) 現在のフォントの高さを に設定する。 任意の長さの名前 を持つレジスタの水平入力位置をマークする。 別の形式では、 と となる。 水平線描画関数。(文字 を用いることも可能) 垂直線描画関数。(文字 を用いることも可能) 1 文字の名前 のレジスタ変数に格納されている数値。 2 文字の名前 のレジスタ変数に格納されている数値。 任意の長さの名前 のレジスタ変数に格納されている数値。 現在のフォントで、コード で指定された文字を出力する。スペシャルフォントは検索されない。 リクエスト が使っているフォントで文字を追加するときに有用。 文字 等を 2 度打ちする。 改行して出力行を引き延す。 垂直方向に 1 em 逆戻りする。(nroff では 1 行) リクエスト と同じ。 ポイントサイズを N に設定する。別の書式では \s±[N] , \s'±N' , \s±'N' , \s±(xy , となることに注意。リクエスト と同じ。 度傾いた出力をする。 解釈されない水平タブ。 垂直方向に 1/2 em 逆戻りする。(nroff では 1/2 行) 局所的な垂直移動。 だけ下げる。(負数なら上げる) 環境 の内容。 別の書式では、 と となる。 文字列 の幅。 行送り関数 (負数なら前へ、正数なら後へ)。 をデバイス制御関数として出力する。 文字列変数かマクロ をデバイス制御関数として処理しないように出力する。 別の書式では、 と となる。 をゼロ幅 (空白なし) で出力する。 を出力し、水平・垂直位置を元に戻す。 はタブや先頭文字を含まない。

エスケープシーケンス はコピーモードで処理される。

と で始まるエスケープシーケンスは 1 文字のエスケープシーケンスを意味しない。 2 文字またはそれ以上の長さのエスケープ名の開始を表す。

バックスラッシュの後に、定義済みエスケープシーケンスを構成しない文字が続いた 場合は、バックスラッシュは単に無視されて、その後の文字はそのものを意味する。

  特殊文字
一般的な特殊文字は、エスケープシーケンス という形式ですでに定義されている。 これらのいくつかは通常のフォントにも含まれるが、ほとんどはスペシャルフォント でないと表示ができない。以下に重要なグリフを示す。完全なリストについては groff_char(7) で参照できる。

レジスタ
レジスタとは値を格納する変数である。 groff では、ほとんどのレジスタは数値を格納するが (上記セクション 数式 を参照)、いくつかは文字列を格納することができる。

それぞれのレジスタには名前が与えられる。 任意のレジスタをリクエスト によって定義・設定することができる。

レジスタに格納した値は、エスケープシーケンス によってとりだすことができる。

便利な定義済みのレジスタがある。 以下では、レジスタの説明を明確にするために、 という表記法は という名前のレジスタを参照する場合に使用する。 という修飾はレジスタ名の一部ではないことに注意してほしい。

  読み出し専用のレジスタ
以下のレジスタは定義済みの値を持っており、ユーザが値を変更することはできない (通常は、ドットで始まるレジスタは読み出し専用である)。 たいていのものは、現在の設定情報やリクエスト呼び出しの結果が格納されている。

troff にオプション -A が使用されていたら が設定される。 nroff では常に になる。 オプション -T が使用されていたら が設定される。 などで用いられる行送り幅。 現在の環境に最後に追加された文字の深さ。 文字がベースラインから下に出ていれば正数になる。 リクエスト によって設定された、センタリングされる残りの行の行数。 現在の環境に最後に追加された文字の高さ。 文字がベースラインの上方に広がっていれば正数になる。 現在の環境に最後に追加された文字の傾き。 文字の傾きとは、文字の上に置かれるアクセント記号の中心が、文字の中心から どれだけ右にずれているかである。 現在のディバージョンにおける現在の垂直位置。レジスタ と同じ。 GNU troff では常に 1 を返す。groff のもとで実行されているのかを マクロがテストするときに使われる。 リクエスト .hla で設定された現在のハイフネーション言語。 直前にある連続するハイフネーションされた行の行数。 連続するハイフネーションされた行が許される最大の行数。 リクエスト で設定される。 現在のハイフネーションフラグ (リクエスト で設定される)。 現在のハイフネーションマージン (リクエスト で設定される)。 現在のハイフネーション間隔 (リクエスト で設定される)。 1 対のカーニングが有効なら を返す。そうでなければ を返す。 現在のリガチャ (合字) モード (リクエスト で設定される)。 タイトル行の長さ (リクエスト で設定される)。 トラップの原因となった直前のリクエスト に必要なスペースの量。 レジスタ と一緒に使用すると便利。 次のページのページ番号。リクエスト によって設定された値か、現在のページ番号に 1 を追加した値になる。 リクエスト によって設定された右寄せされた行の行数。 小数で表わした直前に要求されたポイントサイズ (文字列値)。 リクエスト の引き数として使用するのに便利な、現在のタブ設定の文字列表現。 もっとも最近の垂直位置トラップによって切り詰められた垂直スペースの量。 または、リクエスト によるトラップがひきおこされた場合は、そのリクエストによって生じた 垂直移動量をさらにマイナスした値。 別の言い方をすれば、トラップが発生した時点での、 トラップが起きなかったとした場合の垂直位置と実際の垂直位置との差を 表している。 リクエスト と一緒に使用すると便利。 リクエスト の第 1 引き数によって設定されたパラメータの値。 リクエスト の第 2 引き数によって設定されたパラメータの値。 垂直位置トラップが有効なら 、そうでなければ になる。 現在の有効になっている警告のコード値の総和。 指定された PostScript 画像の左下 x 座標 (PostScript 単位)。 リクエスト により設定される。 指定された PostScript 画像の左下 y 座標 (PostScript 単位)。 リクエスト により設定される。 レジスタ と似ているが、文字の高さと深さを考慮している。 レジスタ と似ているが、文字の高さと深さを考慮している。 文字列のベースラインより下の深さ (幅関数 により生成される)。 の引き数において、直前の文字の中心からの右スキップ幅。 添字の前の直前の文字に追加される水平移動量 (負の値も可能)。 幅関数 により生成される。 文字列のベースラインより上の高さ (幅関数 により生成される)。 指定された PostScript 画像の右上 x 座標 (PostScript 単位)。 リクエスト により設定される。 指定された PostScript 画像の右上 y 座標 (PostScript 単位)。 リクエスト により設定される。

  書き込み可能レジスタ
以下のレジスタはユーザによって読み書きが可能である。 これらは定義済みのデフォルト値を持っているが、ドキュメントを カスタマイズするために変更することができる。

によって設定される)。 0 より大きければ、入力スタックにあるオブジェクトの最大数。 0 以下であれば制限はない。つまり、仮想メモリを使いはたすまで再帰を続けることができる。 直前のリクエスト により実行された system() 関数の戻り値。 現在の年から 1900 を引いた値。2000 年問題を避けるにはレジスタ を代りに用いること。

警告
groff によって生成される警告はすべて名前とコード番号が与えられている。 コード番号は 2 の累乗で、単一の int 型変数でビットエンコードができるように なっている。名前のほうも、警告のグループで参照することができる。

警告名は と オプションで使うことができる。 警告コード番号は、リクエスト とレジスタ で使うことができる。

以外のすべての警告。 伝統的なマクロパッケージのすべての警告をカバーしている。 行連結モードにおいて、1 行の長さと比べて改行を入れられない行の長さが短い場合。 この警告はデフォルトで有効。 存在しない文字が含まれている。この警告はデフォルトで有効。 閉じ区切り記号がない、または開き区切り記号と一致しない。 現在のディバージョンがない時に、引き数のない や のリクエストが使用された。 一致するリクエスト がないのにリクエスト が使用された。 認識されないエスケープシーケンスが使用された。エスケープ文字は無視される。 存在しないフォントが使用された。 この警告はデフォルトで有効。 リクエスト で無視されるテキスト中に不正なエスケープがある。 無視されるテキスト外でこれが発生する場合はエラーとなる。 定義されていない文字列・マクロ・ディバージョンが使用された。 自動的に空であるものと扱われる。通常は、名前ひとつに対してひとつの警告となる。 省略できない引き数が指定されていない。 不正な入力文字。 不正な数式。この警告はデフォルトで有効。 範囲外の引き数が指定された。 定義されていない数値レジスタが使用された。自動的に値として 0 が定義される。 通常は、名前ひとつに対してひとつの警告となる。 数値が期待される場所に が使用された。 意味のない単位指定子が指定された。 リクエストやマクロと引き数の間に空白文字がない。したがって自動的に定義される マクロはない。この警告はデフォルトで有効。 また、この警告は互換モードでは決して発生しない。 数式であいまいな文法が使用された。 タブ文字が不正に使用された (クォートされていないマクロの引き数のところや 数値が要求されているところに使用された)。 すべての警告。

ビット | コード | 警告 | ビット | コード | 警告 | ビット | コード | 警告
0 | 1 | char | 8 | 256 | di | 16 | 65536 | space
1 | 2 | number | 9 | 512 | mac | 17 | 131072 | font
2 | 4 | break | 10 | 1024 | reg | 18 | 262144 | ig
3 | 8 | delim | 11 | 2048 | tab
4 | 16 | el | 12 | 4096 | right-brace
5 | 32 | scale | 13 | 8192 | missing
6 | 64 | range | 14 | 16384 | input
7 | 128 | syntax | 15 | 32768 | escape

互換性
groff は 互換モード を提供しており、古典的な や他の roff の実装のために書かれた roff コードをきちんと処理することができる。

互換モードはコマンドラインオプション によって有効にでき、さらにリクエスト によって無効にすることができる。 互換モードが有効のときは、 数値レジスタ に が設定される。無効のときは になる。

GNU の長い名前に対する設計ではいくつか非互換な部分が生じるので、 この機能が必要とされた。 古典的な troff は

    .dsabcd

を、文字列 ab に内容 cd を定義するとみなして処理する。 通常は、 groff はこれを という名前のマクロの呼び出しとみなして処理する。

また、 古典的な troff は や を という文字列レジスタまたは数値レジスタへの参照とみなして処理する。 しかし、 GNU のネイティブモード では通常は長い名前の開始とみなして処理する。

互換モード では、groff はこれらを伝統的な方法で処理するようになる。 そのかわり、長い名前は認識されない。

一方で、 GNU ネイティブモード での groff は以下のエスケープシーケンス ( は文字列・マクロ・ディバージョン・数値レジスタ・フォント・環境の名前としては 使用できない。しかし、 古典的な troff は可能である。

小数のポイントサイズは顕著な非互換性の原因となる。 古典的な troff では、リクエスト は単位指定子を無視するので

    .ps 10u

はポイントサイズを 10 ポイントに設定する。しかし、groff のネイティブモード ではポイントサイズは 10 スケールポイントに設定される。

groff モードでは、整形されていない入力文字と整形された出力文字の間には根本的な 差異がある。 出力文字がどのように出力されるのかということに影響するものはすべて文字と 一緒に格納される。ある出力文字が構築されると、それ以降にどんなリクエストが 実行されてももはや影響されることはない。これは、以下のようなリクエストの 場合も含まれる。

通常は、現在の出力行に文字を追加する前に、出力文字は入力文字ごとに順次 構築されていく。 実は、マクロ・ディバージョン・文字列はすべて同じタイプのオブジェクトである。 これらは入力文字と出力文字の取り得る組み合わせのリストを含んでいる。

出力文字は、(マクロ処理の対象となる) 入力文字のような動作はしない。 出力文字は、それの構築元になった、入力文字が持っていたような特別な属性は いっさい引き継がない。 以下の例で詳しく説明する。

    .di x
    \\\\
    .br
    .di
    .x

GNU モード では、この例は のように出力されるだろう。 入力のバックスラッシュの対 はひとつのバックスラッシュ に変換される。そして、結果として出力されるバックスラッシュは これらが参照された時でもエスケープ文字として処理されることはない。

古典的な troff では、これらは参照された時にエスケープ文字として処理されるので、最後には ひとつのバックスラッシュ が出力されるだろう。

一文字を表示する正しい方法は、エスケープシーケンス を使用することである。このやりかたなら、ディバージョンの中で使用にかかわらず 常に現在のエスケープ文字をひとつだけ出力するだろう。 これは、GNU モードと互換モードのどちらでも動作するはずである。

ディバージョンにエスケープシーケンスを格納する場合は、ディバージョンが参照されるごとに エスケープシーケンスが処理される。 伝統的な の透過出力や新しい のエスケープシーケンスを使用するべきである。

バグ
現在、groff システムのドキュメントは変化と進化の途上にある。 一時的にドキュメント同士でささやかな矛盾点が見られるだろう。

警告 セクションは troff(1) に基づいている。

著者
このドキュメントは groff (GNU roff パッケージ) の一部である。 Bernd Warken <bwarken@mayn.de> によって記述された。

このドキュメントは FDL (GNU Free Documentation License) のバージョン 1.1 以降の元に配布される。あなたのシステムにも FDL のコピーがあるはずである。 以下でもオンラインで参照できる。

    http://www.gnu.org/copyleft/fdl.html.

以前は、groff 言語の拡張機能についてはマニュアルページ troff(1) に記述されていた。 拡張機能の基本的な事項はこのドキュメントにも含まれるが、 より詳細な情報は groff info ファイルで参照できる。

関連項目
groff 言語の主な情報源は groff info (1) ファイルである。

roff と groff システムの概要とさらなるドキュメントのポインタは roff(7) を参照のこと。

フォーマッタプログラムについては groff(1) と troff(1) に記述されている。 すべての定義済みグリフ名については groff_char(7) に示してある。

古典的な troff についてのドキュメントは以下の URL にある。

    http://cm.bell-labs.com/cm/cs/cstr.html
    http://www.kohala.com/start/troff/