GROFF_OUT(5)

名称
groff_out - groff の中間出力フォーマット

解説
このマニュアルページは、GNU の roff(7) テキスト処理システムの中間出力フォーマットについて記述しています。 この出力は、デバイスの後処理プログラムに渡される前に、GNU troff(1) プログラムの実行によって生成されます。

GNU の roff 処理系である groff(1) は troff を包むラッパプログラムであり、 この troff は自動的に後処理プログラムを呼び出すため、 通常この出力は目には触れません。 そのため、これは groff システム において 中間的 と呼ばれます。 groff プログラムには後処理を行わないようにする -Z オプションがあり、このオプションをつけることで troff を手動で呼び出した時のように 生成された中間出力を標準出力に送ることができます。

この文書において、 troff 出力 という用語は GNU troff プログラムによる出力を指し、 中間出力 という用語は後処理プログラム用にこの出力を下ごしらえするパーサによって 受け付けられる言語を指します。 このパーサは空白をうまく処理し、 また旧式の要素を互換性を保つために実装しています。 それ以外は、どちらの形式も同じものです。 groff 以前の版の roff は、 古典的な troff と表記されます。

中間出力のコンセプトの一番の目的は、すべてのデバイスに対して 共通のプログラミングインタフェースを提供することによって、 後処理プログラムの開発を容易にすることです。 これは、 groff(7) 言語とはまったく異なった独自の言語です。 groff 言語は、テキスト処理用の高レベルなプログラミング言語であるのに対し、 中間出力言語は、文字表示や描画のためにページ上のすべての位置を指定する、 低レベルのアセンブリ言語のような言語です。

groff によって生成される中間出力はかなり読みやすいのですが、一方 古典的な troff の出力は、奇妙な習慣のために理解しづらいものでした。 この習慣は、まだ GNU troff でサポートされてはいますが、もう使われていません。

言語のコンセプト
troff の実行中に、roff への入力は、指定されたデバイスの どの位置に何が印字されるのかという情報へと細かく分解されます。 したがって、中間出力フォーマットの言語はとても小さなものです。 その唯一の要素は、引数あり、もしくは引数なしのコマンドです。 この文書中において、「コマンド」という用語は、 文書整形に使われる roff 言語ではなく、常に中間出力言語を指します。 これらのコマンドには、テキストの表示や図の描画、デバイスの制御を 行うものがあります。

  区切り
古典的な troff 出力 には、空白に関して奇妙な要求事項があります。 しかし groff 出力のパーサは、空白を最大限に省略可能とすることによって、 空白をよりうまく処理します。 空白文字、つまり tab, space, newline 文字は、常に構文上の意味を持ちます。 これらの文字は印字可能ではありません。 なぜなら、出力に含まれる空白は、すべて位置コマンドによって 空けられるからです。

どの space や tab の連続も、1 つの 構文上の 空白 として扱われます。 これによってコマンドと引数とが区切られます。 しかしこれは、コマンドコードとその引数とが、空白がないために ぶつかり合ってしまう場合のみ必要となります。 ほとんどの場合、これは可変長のコマンド名や引数、引数リスト、 コマンド群が一緒に出てきた時に発生します。 固定長の既知のコマンドと引数の場合は、 構文上の空白によって区切る必要はありません。

改行も構文上の要素です。 すべてのコマンド引数の後には、空白やコメント、改行文字を続けることができます。 したがって 構文上の改行 は、省略可能な構文上の空白の後に、省略可能なコメントが続き、 これに改行文字が続いたものから構成されると定義されます。

位置指定やテキスト用の普通のコマンドは 1 文字から成り、 既定数の引数を取ります。 歴史的な理由により、パーサはそれらのコマンドを同じ行に重ねることを 許しています。 しかし幸いなことに、groff の中間出力において、 少なくとも 1 つの引数を持つすべてのコマンドの後には改行が続くので、 非常に読みやすくなっています。

その他のコマンド — 描画やデバイス制御用のもの — は、 さらに複雑な構造をしています。 長いコマンド名のものもありますし、可変個の引数を取るものもあります。 したがって、すべての D と x コマンドには、設計上、最後の引数の後に 構文上の改行 が必要です。 ただ 1 つのコマンド `x X' だけは、いくつかの行に渡って引数を置くことができますが、 その他のすべてのコマンドは、コマンドと同じ行にすべての引数が なければなりません。

空行、すなわち空白やコメントだけからなる行は、 どこにあっても構いません。 それらは単に無視されます。

  引数の単位
コマンドの中には、ある測定単位で表された値とみられるけれど、 スケール指示子 に対応する文字が、出力コマンド引数と一緒に書かれていない 整数引数を取るものがあります。 このトピックに関するさらなる情報は、 groff(7) と groff info ファイルを参照してください。 ほとんどのコマンドは、デバイスの基本単位であるスケール指示子 を想定しており、いくつかのコマンドはデバイスの スケールドポイント単位 である を想定していますが、色コマンドなどの他のコマンドは 単なる整数を期待しています。 これらのスケール指示子は、指定されたデバイスに 関連したものであることに注意してください。 それらは、デバイスの DESC ファイルで指定されたパラメータによって定義されています。 groff_font(5) を参照してください。

単一文字は、8 ビット目が設定されていても構いません。 これはフォント名や特殊文字名も同じです。 文字名やフォント名は、任意の長さにできます。 印刷される文字は、常に現在のフォント中に存在するものです。

文字列引数は常に、次に続く空白文字 (空白、タブ、改行) によって終了します。 埋め込まれた # 文字は引数の一部とみなされ、コメントコマンドの始まりとは解釈されません。 整数引数は常に、次に続く数字以外の文字によって終了します。 そしてその文字は、次の引数またはコマンドの最初の文字とみなされます。

  文書部分
正しい中間出力の文書は、導入部と本体の 2 つの部分から構成されます。

導入部 の役割は、3 つの正確に指定されたコマンドを用いて、 一般的なデバイスパラメータを設定することです。 groff の導入部 は、以下の 3 行から (この順番で) 構成されていることが保証されています:

    x T device
    x res n h v
    x init

この引数の組は、 デバイス制御コマンド の節で概略が説明されています。 しかし、中間出力フォーマット用のパーサは、 追加の空白やコメントも同様に受け入れることができます。

本体 は、文書データの処理を行う主要な節です。 構文上は、導入部で使れたコマンド以外のコマンドが連続したものとなります。 処理は、最初の x stop があるとすぐに終了します。 すべての groff 中間出力の最終行には、このコマンドが必ずあります。

意味的には、本体はページ指向です。 新しいページは p コマンド によって開始されます。 位置指定、文字出力、描画コマンドは、常に現在のページに対して行われます。 ですから、それらのコマンドは最初の p コマンド の前には現れません。 ( H と V コマンド による) 絶対位置指定は、現在のページに相対的に行われ、 それ以外の位置指定は、現在のページの現在位置に相対的に行われます。

コマンドリファレンス
この節では、すべての中間出力コマンドや古典的なコマンド、 groff 拡張について記述しています。

  コメントコマンド

#anything⟨end_of_line⟩
    コメントです。 # 文字から次の改行文字までのすべての文字を無視します。

このコマンドは、中間出力内にコメントを記述する唯一の方法です。 それぞれのコメントの前には、任意個の 構文上の 空白 があっても構いません。 またすべてのコマンドは、コメントによって終了できます。

  単純コマンド
この小節では、1 文字から成り、既定個の引数を取るコマンドを説明しています。 そのほとんどは、位置指定とテキスト出力のコマンドです。 これらのコマンドは、空白をうまく処理します。 状況に応じて、 構文上の空白 は、コマンド文字とその引数の前にも、後にも、 その間にも挿入できます。 これらすべてのコマンドは、重ねることができます。 つまり、同じ行に他の単純コマンドが前にあってもいいですし、 他の任意のコマンドが後に続いても構いません。 区切りに使われる構文上の空白は、2 つの整数引数が衝突する時や、 前に続く引数が文字列引数で終わる時にのみ必要となります。 現時点のデバイス設定データを環境スタックにコピーして、 新しい環境を開始します。 現在の環境はデバイス仕様書によって設定され、 設定コマンドで操作されます。 (前にある { コマンド で開始された) 現在の環境を終了し、環境スタックから、 以前の環境を現時点のデバイス設定データとして復帰させます。
特殊な groff 文字名 を印字します。 任意の長さの文字名を指定可能とするために、 その後には構文上の空白または改行が必要となります。 文字は現在の印字位置に印字され、 文字の大きさはフォントファイルから読み込まれます。 印字位置は変化しません。 現在の印字位置に、文字 を印字します。 文字の大きさはフォントファイルから読み込まれます。 印字位置は変化しません。 フォントをフォント番号 (非負整数) に設定します。 現在のページの左端から絶対水平位置 (非負整数、単位は基本単位 に移動します。 水平方向、右に、基本単位 で (非負整数) だけ移動します。 [54] では n に負の値も指定できますが、 groff ではこれは使用していません。 異なるカラースキームを用いて、テキスト (グリフ) や線図、 図形オブジェクトの輪郭の色を設定します。 これと類似した、図形オブジェクトを色で塗り潰すためのコマンドは DF です。 色の成分は、0 から までの整数で指定します。 色の成分数とその意味は、カラースキームによって異なります。 これらのコマンドは、groff のエスケープシーケンス \m によって生成されます。 これによって位置は変更されません。 これらのコマンドは groff 拡張です。
    シアン、マゼンタ、黄の 3 つの色の成分を持つ CMY カラースキームを用いて、 色を設定します。 デフォルトの色の値 (ほとんどの場合、黒) に設定します。 成分引数はありません。 0 (黒) から (白) までの整数引数を指定して、 灰色の色調に設定します。 シアン、マゼンタ、黄、黒の 4 つの色の成分を持つ CMYK カラースキームを 用いて、色を設定します。 赤、緑、黄の 3 つの色の成分を持つ RGB カラースキームを用いて、 色を設定します。
現在のフォントのインデックス (整数、通常は非負) を持つ文字を印字します。 -T html が使用された場合、指定された幅の改行されない空白を指示するために、 負の値も使用されます。 例えば N -193 は、193u の幅を持つ改行されない空白を表します。 印字位置は変更しません。 このコマンドは groff 拡張です。 デバイスに対して改行を通知しますが、 このコマンドによって位置は指定されません。 古典的な troff では、何の動作も起こさせずに中間出力を もっと人に読みやすくするために、整数引数 と によって、現在行の前 (before) と後 (after) の空白を通知していました。 groff では、これらの引数は単に無視されます。 しかし、これらは互換性のために提供されなければなりません。 出力において、新しいページを開始します。 ページ番号は、 によって設定されます。 このページは、それまでに処理されたページとは完全に独立しています。 たとえそれが同じページ番号を持っていたとしてもです。 出力の垂直位置は、自動的に 0 に設定されます。 すべての位置指定やテキストの表示、図の描画は、 常にページと相対的に行われます。 したがって p コマンドは、これらのコマンドの前に発行されなければなりません。 ポイントの大きさを スケールドポイント (GNU troff では、単位は ) に設定します。 古典的な troff は、かわりに単位として ポイント (を使っていました。 互換性 の節を参照してください。 単語、すなわち空白文字もしくは改行によって終了する連続した文字 を印字します。 省略可能である 2 つ目の整数引数は無視されます (これによってフォーマッタは、偶数個の引数を生成することができます)。 最初の文字は現在位置に印字され、現在の水平位置は最初の文字の幅だけ ずらされます。 同様にして、それぞれの文字も処理されます。 文字幅はフォントファイルから読み込まれ、現在のポイントの大きさで 拡大された後、水平解像度の倍数に丸められます。 特殊文字はこのコマンドを用いて印字できません (名前付き文字の印字には C コマンドを使用してください)。 このコマンドは groff 拡張です。 これは DESC ファイルに tcommand キーワードを含んでいるデバイスに対してのみ使用されます。 groff_font(5) を参照してください。 トラックカーニングを行いながら単語を印字します。 これは t コマンドと同じですが、現在の水平位置が文字幅と (整数、単位は基本単位 との和だけずらされるところが異なります。 このコマンドは groff 拡張です。 これは DESC ファイルに tcommand キーワードを含んでいるデバイスに対してのみ使用されます。 groff_font(5) を参照してください。 現在のページの上端から絶対垂直位置 (非負整数、単位は基本単位 に移動します。 下に、基本単位 で (非負整数) だけ移動します。 [54] では n に負の値も指定できますが、 groff ではこれは使用していません。 可読性を上げるためのパディングの空白について通知します。 字間、行間指定自体は、移動コマンドによって明示的に行われなければなりません。

  図形コマンド
中間出力内のそれぞれの図形コマンドまたは描画コマンドは、文字 D で始まり、その後にサブコマンドを表す 1 つもしくは 2 つの 文字が続きます。 さらにその後には、単一の空白文字で区切られた既定個もしくは 可変個の整数引数が続きます。 D コマンド は、同じ行に (コメント以外の) 他のコマンドが続いてはいけません。 したがって、それぞれの D コマンド は構文上の改行で終了します。

troff 出力は、古典的な空白挿入の規則に従います (コマンドとサブコマンド間には空白を入れず、 すべての引数の前には空白を入れます)。 しかしパーサは、コマンド文字間に空白を入れることを許していますし、 最初の引数の前の空白を省略可能にしています。 いつもと同様に、それぞれの空白は、 タブ文字と空白文字の任意の連続で構いません。

図形コマンドには、可変個の引数を取るものがあります。 この場合、それらは基本単位 を単位とした大きさを表す整数です。 と呼ばれる引数は、水平方向の距離を表しています。 正の値は右を、負の値は左を意味しています。 と呼ばれる引数は、垂直方向の距離を表しています。 正の値は下を、負の値は上を意味しています。 これらの距離はすべて、現在位置からの相対的なオフセットです。

特に記述がなければ、それぞれの図形コマンドは、 groff の同様の \D エスケープシーケンスに直接対応しています。 groff(7) を参照してください。

不明な D コマンドは、デバイス固有のコマンドとみなされます。 その引数は文字列としてパースされ、 その情報はまるごと後処理プログラムに送られます。

以下のコマンドリファレンスでは、構文要素 ⟨line_break⟩ は、 区切り の節で定義された 構文上の改行 を意味しています。 現在位置からオフセット を通り、指定されていたら を通り、 までの B スプライン曲線を描画します。 このコマンドは、可変個の引数のペアを取ります。 現在位置は描画された曲線の最終点に移動します。 を中心として、現在位置から までの円弧を描画します。 現在位置は円弧の最終点に移動します。 現在位置を最左端とする、半径 (整数、単位は基本単位 の塗り潰された円を、現在の塗り潰し色で描画します。 現在位置は円の最右端に移動します。 省略可能である 2 つめの整数引数は無視されます (これによってフォーマッタは、偶数個の引数を生成することができます)。 このコマンドは groff 拡張です。 現在位置を最左端とする、半径 (整数、単位は基本単位 の円を、線で描画します。 現在位置は円の最右端に移動します。 現在位置を最左端とする、水平半径 と垂直半径 (どちらも整数、単位は基本単位 の塗り潰された楕円を、現在の塗り潰し色で描画します。 現在位置は楕円の最右端に移動します。 このコマンドは groff 拡張です。 現在位置を最左端とする、水平半径 と垂直半径 (どちらも整数、単位は基本単位 の楕円の輪郭を描画します。 現在位置は楕円の最右端に移動します。 異なるカラースキームを用いて、塗り潰された描画オブジェクト用の 塗り潰し色を設定します。 これと類似した、 テキストや線図、図形オブジェクトの輪郭の色を設定するコマンドは m です。 色の成分は、0 から までの整数で指定します。 色の成分数とその意味は、カラースキームによって異なります。 これらのコマンドは、groff のエスケープシーケンス \D'F ...' と \M (他の対応する図形コマンドがない場合) によって生成されます。 これによって位置は変更されません。 このコマンドは groff 拡張です。
    シアン、マゼンタ、黄の 3 つの色の成分を持つ CMY カラースキームを用いて、 塗り潰された描画オブジェクト用の塗り潰し色を設定します。 塗り潰された描画オブジェクト用の塗り潰し色を、 デフォルトの色の値 (ほとんどの場合、黒) に設定します。 成分引数はありません。 0 (黒) から (白) までの整数引数を指定して、 塗り潰された描画オブジェクト用の塗り潰し色を、灰色の色調に設定します。 シアン、マゼンタ、黄、黒の 4 つの色の成分を持つ CMYK カラースキームを 用いて、塗り潰された描画オブジェクト用の塗り潰し色を設定します。 赤、緑、黄の 3 つの色の成分を持つ RGB カラースキームを用いて、 塗り潰された描画オブジェクト用の塗り潰し色を設定します。
引数 は、-32767 から 32767 までの整数でなければなりません。

    0 ≤ n ≤ 1000
        塗り潰された描画オブジェクト用の塗り潰し色を、灰色の色調に設定します。 ここで 0 は塗り潰された白に対応し、1000 (デフォルト) は 塗り潰された黒に対応します。 この間の値は、中間的な灰色の色調に対応します。 これは、コマンド DFg によって旧式のものとなっています。

    n < 0 or n > 1000
        塗り潰された描画オブジェクト用の塗り潰し色を、 現在、テキストや輪郭に使われている色に設定します。 コマンド m を参照してください。 例えば、コマンド列
            mg 0 0
            Df -1
        は、すべての色を青に設定します。

    これによって位置は変更されません。 このコマンドは groff 拡張です。
現在位置からオフセット (整数、単位は基本単位 まで線を引きます。 現在位置は描画した線の最終点に移動します。 現在位置からオフセット を通り、 を通り、 を通って最初の点に戻るような多角形を、線で描画します。 偶数番目の引数の和を垂直位置に加算したところに移動します。 これは理にかなったものではありませんが、 互換性のためにそのままになっています。 多角形は閉じられるため、描画の最終点は開始点となります。 したがって位置は変更されません。 このコマンドは groff 拡張です。 対応する Dp コマンドと同じ引数を持つ同様のマクロですが、 多角形の外枠を描画するのではなく、塗り潰された多角形を描画します。 Dp と同様に変更されます。 位置は変更されません。 このコマンドは groff 拡張です。 の場合、現在の線幅を (整数、単位は基本単位 に設定します。 の場合、線幅を可能な最小の細さに設定します。 の場合、線幅をポイントサイズに比例するようにします (これは、最初に Dt コマンドが指定されるまでのデフォルトです)。 引数を実際の水平位置に足したところに変更されます。 これは理にかなったものではありませんが、 互換性のためにそのままになっています。 位置は変更されません。 このコマンドは groff 拡張です。

  デバイス制御コマンド
各々のデバイス制御コマンドは、文字 x で始まり、ひとつの空白文字 (groff では省略可能であり、任意個の空白やタブも使えます) と サブコマンドの文字または単語が続きます。 (もし引数がある場合) それぞれの引数の前には、構文上の空白が なければなりません。 すべての x コマンドは 構文上の改行 によって終了します。 デバイス制御コマンドの後には、(コメントを除いて) 同じ行に 他のコマンドが続いてはなりません。

サブコマンドは基本的に 1 文字ですが、 読みやすくするために 1 語で書く事もできます。 つまり次のタブ、空白、改行文字で終了する任意の文字列を 使用する事ができます。 サブコマンドの単語に含まれる最初の文字以外のすべての文字は、 単に無視されます。 例えば troff は初期化コマンド x i として x init を、解像度コマンド x r として x res を出力します。 しかし、 x i_like_groff や x roff_is_groff resp. のような記述も、同様に同じコマンドとして受け付けられます。

以下では、構文要素 ⟨line_break⟩ は、 区切り の節で定義された 構文上の改行 を意味しています。 を、現在のファイルに対して指定した名前として、エラーレポート中で使用します。 これは、groff が内部的なパイプ機構を使用している場合、 元のファイル名を記憶しておくのに役に立ちます。 入力ファイルは、このコマンドで変更されません。 このコマンドは groff 拡張です。 フォント位置 (非負整数) に、フォント名 (テキストの 1 単語) のフォントを組み込みます。 groff_font(5) を参照してください。 文字の高さを (正整数、単位はスケールドポイント 古典的な troff は、かわりに単位としてポイント (を使用していました。 互換性 の節を参照してください。 デバイスを初期化します。 これは、導入部の 3 番目のコマンドです。 解釈されますが、無視されます。 古典的な文書には、「 デバイスを停止します。 リスタート できます 」とあります。 は解像度を表し、 はそのデバイスの最小水平移動量、 は最小垂直移動量を表します。 すべての引数は正整数で、単位は 1 インチ当たりの基本単位 です。 これは、導入部の 2 番目のコマンドです。 傾斜を 度 (整数、単位は基本単位 に設定します。 現在のファイルの処理を終了します。 すべての troff 中間出力の最後のコマンドとして発行されます。 もしあれば、トレイラ情報を生成します。 groff では、実際には単に無視されます。 デバイスの名前を に設定します。 これは後に続く空白文字で終了する文字列です。 可能なデバイス名は、groff の -T オプションのものと同じです。 これは、導入部の最初のコマンドです。 スペースの下線を設定します。 が 1 の場合、スペースの下線を引き始め、 が 0 の場合、スペースの下線を終了します。 これは nroff モードにおける cu リクエストに必要であり、その他の場合は無視されます。 このコマンドは groff 拡張です。 文字列 を解釈せずにデバイスに送ります。 後に続く行が + 文字で始まっている場合、その行は継続行として以下のように解釈されます。 + は無視され、かわりに改行文字がデバイスに送られます。 そして、行の残りは解釈されずに送られます。 同様にして、最初の文字が + 文字でない行まで、後に続くすべての行に適用されます。 このコマンドは groff エスケープシーケンスである \X によって生成されます。 この行の継続機能は groff 拡張です。

  旧式のコマンド
古典的な troff の出力では、ほとんどの場合、水平移動と 1 文字の印字とが組合わさった とても奇妙なコマンドを用いて、1 文字の出力が行われます。 このコマンドにはコマンドコードがなく、厳密に 2 つの数字と 1 つの文字からなる、3 文字の引数によって表現されます。

右へ、基本単位
    で (厳密に 2 桁の 10 進数) だけ移動し、 文字 を印字します。

    groff では、このコマンドの前後や中に、任意個の構文上の空白を 入れることができます。 唯一、同じ行の前にあるコマンドが可変長の引数を持っている場合にのみ、 区切りの空白が必須となります。 古典的な troff では、これらのコマンドやその他のコマンドの大きなかたまりが、 ほとんどの場合空白なしに使用されていました。 そのためこのような出力は、ほとんど解読不能でした。

現代の高解像度デバイスにとって、このコマンドは理にかなったものではありません。 というのは、文字の移動幅が 2 桁の 10 進数で表現できないほど 大きくなり得るからです。 groff では、これらは以下のデバイスでのみ使用されます。 X75, X75-12, X100 そして X100-12 。 その他のデバイスには、 コマンド t と u が、より適した機能を提供します。

後処理
roff の後処理プログラムは、中間出力を、 デバイスに送られる「作用」に変換する働きを持つプログラムです。 デバイスは、プリンタのようなハードウェアでもいいですし、あるソフトウェアの、 画像またはテキスト処理に適したファイル形式でも構いません。 groff の処理系は、これらの後処理プログラムの作成が簡単になるような、 強力な手法を提供しています。

それぞれのデバイスに共通のインタフェースを持つクラスのメソッドを介して、 中間出力をパースしたり、得られた情報をデバイスに送るライブラリ関数が あります。 groff の後処理プログラムがしなければならないのは、 このクラスのメソッドを再定義することだけです。 詳細は、 関連ファイル 節のリファレンスを参照してください。

使用例
この節では、同一の入力から 3 つの異なるデバイス用に生成された中間出力を 示します。 この入力は、コマンドラインから groff に与えた hell world という文です。 高解像度デバイス ps

    x T ps
    x res 72000 1 1
    x init
    p1
    x font 5 TR
    f5
    s10000
    V12000
    H72000
    thell
    wh2500
    tw
    H96620
    torld
    n12000 0
    x trailer
    V792000
    x stop

この出力を後処理プログラム grops(1) に与えることで、その PostScript ファイル形式が得られます。 低解像度デバイス latin1

    これは、位置指定が小さなスケールで行われることを除いて、 高解像度デバイスの時と同じです。 いくつかのコメント ( # で始まる行) は、意味を明確にするために追加しました。 これらはフォーマッタによって生成されたものではありません。

    # 導入部
    x T latin1
    x res 240 24 40
    x init
    # 新しいページの開始
    p1
    # フォントの設定
    x font 1 R
    f1
    s10
    # ページの初期位置指定
    V40
    H0
    # テキスト 'hell' の出力
    thell
    # 空白を通知し、それを水平ジャンプによって行います
    wh24
    # テキスト `world' の出力
    tworld
    # 改行を通知します。しかし何もしません。なぜなら ...
    n40 0
    # ... 文書の終りに達したからです。
    x trailer
    V2640
    x stop

この出力を後処理プログラム grotty(1) に与えることで、整形されたテキスト文書が得られます。 古典的形式の出力

    現在のプリンタに比べて、コンピュータのモニタはとても解像度が低いので、 X のデバイスへの中間出力には、2 桁の数字の移動量を伴う 飛び書き (jump-and-write) コマンドが使用できます。

    x T X100
    x res 100 1 1
    x init
    p1
    x font 5 TR
    f5
    s10
    V16
    H100
    # 旧式の飛び書きコマンドでテキストを出力
    ch07e07l03lw06w11o07r05l03dh7
    n16 0
    x trailer
    V1100
    x stop

この出力を後処理プログラム xditview(1x) や gxditview(1) に与えることで、X に表示することができます。

旧式の飛び書きコマンドのために、古典的な出力中のテキスト群は、 ほとんど解読不能です。

互換性
古典的な troff の中間出力言語は、 [97] で初めて文書化されました。 groff の中間出力フォーマットは、以下の特徴を除いてこの仕様書と互換性があります。 古典的な準デバイス非依存性は、まだ実装されていません。 古いハードウェアは、現在我々が使用しているものとは非常に異なっています。 そのため、groff のデバイスも、古典的な troff のものと基本的に異なっています。 例えば、古典的な PostScript デバイスは post と呼ばれており、1 インチ当たり 720 単位の解像度を持っていました。 一方 groff の ps デバイスは、1 インチ当たり 72000 単位の解像度を持っています。 おそらく古典的な準デバイス非依存性に似た、スケールしなおす機構を 実装すれば、これらは現代の groff に統合することができるかもしれません。 B スプラインコマンド D~ は中間出力のパーサによって正しく扱われますが、 いくつかの後処理プログラムには描画ルーチンが実装されていません。 groff では、コマンド s と x H の引数の単位は、暗黙的にスケールドポイント ですが、古典的な troff の単位はポイント (です。 これは非互換なのではなく、互換性のある拡張です。 というのも、古典的なテキストデバイスや groff のテキストデバイスを含む すべてのデバイスにおいて、 sizescale パラメータなしでどちらの単位も一致するからです。 sizescale パラメータを持つ数少ない groff のデバイスも、 存在しないか、違う名前をしているか、異なる解像度を持っているように見えます。 したがって、古典的なデバイスとの衝突はほとんど起こらないでしょう。 コマンド Dp, DP, Dt の後に発生する位置の変更は非論理的ですが、古いバージョンの groff が この機能を使用しているので、互換性のために残してあります。 groff 拡張である D コマンドの後の位置に、一時、多少の混乱がありました。 この混乱は、すべての groff の描画コマンドに対して古典的な規則を 確立することにより明確にされました。

    図形オブジェクトが描画された後の位置は、そのオブジェクトの終端です。 円や楕円の「終端」は右端です。

この規則によって、上記の描画コマンドに対して指定される位置は、 とても自然になりました。

groff と古典的な troff との違いは、 groff_diff(7) に文書化されています。

関連ファイル

/usr/share/groff_font/devname/DESC
    デバイス name 用のデバイス記述ファイルです。

⟨groff_source_dir⟩/src/libs/libdriver/input.cpp
    中間出力のパーサと後処理プログラムを定義しています。 このファイルは、 groff ソースツリーのトップディレクトリ (例えば @GROFFSRCDIR@ ) から相対的に置かれます。 このパーサは、 groff の中間出力フォーマットの最終的な仕様書となります。

関連項目
groff(7) のような表記は、マニュアルページを指しています。 これは、man-page 文書システムのセクション 7 にある groff を指しています。 この例のマニュアルページを読む場合は、デスクトップのヘルプシステムの セクション 7 を探すか、シェルプロンプトから以下のように呼び出してください。

詳細は man(1) を参照してください。

groff(1)
    オプション -Z についてと、groff のさらなる読み物。

groff(7)
    数値の単位やエスケープシーケンスのような groff 言語の詳細について。

groff_font(5)
    DESC ファイルのデバイススケールパラメータの詳細について。

troff(1)
    デバイス非依存の中間出力を生成します。

roff(7)
    歴史的な側面と、roff システムの一般的な構造について。

groff_diff(7)
    groff の中間出力と古典的な troff の中間出力との違いについて。

grodvi(1), grohtml(1), grolbp(1), grolj4(1), grops(1), grotty(1)
    groff の後処理プログラム。

1 つの文書で groff システムのすべての側面を扱っているものとしては、 groff info ファイル を参照してください。 これは統合されたヘルプシステムで読むことができ、 emacs(1) の中で、もしくはシェルプロンプトから以下のようにして参照できます。

古典的な troff の出力言語 は、AT&T ベル研究所の 2 つの CSTR 文書に記述されており、 から、オンラインで入手できます。

[CSTR #97]
    Brian Kernighan によって書かれた A Typesetter-independent TROFF は、出力言語に関する最初の文書であり、最も簡潔なものです。 を参照してください。

[CSTR #54]
    J. F. Osanna と Brian Kernighan によって書かれた 1992 年版の Nroff/Troff User's Manual は、出力言語に関しては [CSTR #97] ほど簡潔ではありません。 を参照してください。

作者
Copyright (C) 1989, 2001, 2002, 2003 Free Software Foundation, Inc.

この文書は、FDL (GNU Free Documentation License) バージョン 1.1 か それ以降のものに基づいて配布されています。 あなたは、このパッケージとともに FDL のコピーを受け取っているはずですが、 これは からもオンラインで入手可能です。

この文書は GNU の roff ディストリビューションである groff の一部です。 これは、出力言語の groff 拡張部分のみを記述した以前の版 - GPL にて公開 - に基づいています。 これは 2002 年に によって書き直され、 よって保守されています。