GROFF(7) | Miscellaneous Information Manual | GROFF(7) |
groff - GNU roff 言語の簡易リファレンス
groff とは、 GNU roff を表しており、roff 清書システムをフリーで実装したものです。 groff システムの概観ならびに背景については roff(7) を参照してください。
このドキュメントでは、groff 内で使用される、あらかじめ定義された roff 言語要素を簡潔に説明しているだけです。 古くからある機能と groff 拡張機能についての両方とも扱っています。
歴史的に、 roff 言語 は troff と呼ばれています。 groff は、古くからあるシステムと互換性を持ちつつ、独自の拡張機能も 提供しています。 そのため GNU 版では、 roff, troff, groff 言語 という術語は同義として使うこともできるでしょう。 しかし、 troff は、どちらかと言えば古くからの機能に対して適用されるという 傾向があり、それに対して、 groff は GNU 拡張に重きを置いています。 そして、 roff は、この言語の一般的な術語になっています。
このファイルは、 groff info(1) ファイルにある完全なドキュメントの簡易版に過ぎません。 info ファイルの方がより詳細で実情に近く、正確な情報を含んでいます。
groff ドキュメントを書くために使う一般的な文法は比較的 やさしいのですが、 roff 言語の拡張機能を書くのは少々骨が折れるかもしれません。
roff 言語は、行指向の言語です。 行には、制御行とテキスト行の 2 種類しかありません。 制御行は制御文字で始まります。 制御文字は、デフォルトではピリオド \&\$*\& あるいはシングルクォート \&\$*\& です。 そのほかの文字で始まる行はすべてテキスト行です。
制御行 は、コマンドを表し、オプションで引数を取ることもあります。 制御行は、次のような文法になります。 先頭の制御文字の後には、コマンド名を続けることができます。 引数は、もしあれば、コマンド名や他の引数と空白で分けられます。 例えば、次のようにします。
.command_name arg1 arg2
インデント用に、先頭の制御文字とコマンド名との間にはスペースや タブ文字をいくつ入れても良いですが、制御文字は行の先頭になくては なりません。
テキスト行 は、表示される部分のことです。 テキスト行はエスケープシーケンスで変更することができます。 エスケープシーケンスは先頭にバックスラッシュ \&\$*\& を置くことで認識されます。 これらは、行や単語の一部に含まれ、整形要素となったり 関数となったりします。 エスケープシーケンスには、シングルクォート \&\$*\& で区切られた引数を取るものもありますし、 開き括弧 \&\$*\& に続いて符合化され長さの一定なものや、角括弧 \&\$*\& と \&\$*\& で括られているものもあります。
roff 言語は、マクロなど、言語拡張機能を書くための柔軟な手段を 提供しています。 マクロ定義を解釈する際に、roff システムは コピーモード と呼ばれる特別なモードに入ります。
コピーモードの振る舞いはとても扱いにくいものでもありますが、 確実に安全に使えるようにするルールがいくつかあります。
このやり方は、一番効率の良いコードが生成できる というわけではありませんが、最初の一歩としては使えるはずです。 さらに良いやり方については groff info ファイルおよび groff_tmac(5) を参照してください。
roff ソースファイルを読むのはこれよりは簡単です。 すべてのマクロ定義部分で 2 重になっているバックスラッシュを 1 つに置き換えればよいだけです。
roff 言語の要素は、テキストファイルに整形用情報を 付加するものです。 基本的な要素は、あらかじめ定義されたコマンド および変数であり、 この要素のおかげで roff は本格的なプログラミング言語に なっているのです。
roff コマンドには 2 種類あります。 コマンドは引数を取ることもあります。 リクエスト は、ドット \&\$*\& あるいは \&\$*\& で始まる行に書かれるものです。 これに対して エスケープシーケンス は、 バックスラッシュ \&\$*\& で始まる、行埋め込み式の関数や単語中の整形要素です。
ユーザは独自の整形コマンドを \&\$*\& リクエストを使って定義することができます。 これらのコマンドは マクロ と呼ばれていますが、実際にはリクエストとまったく同様に使われます。 マクロパッケージは groff 言語で書かれた定義済みのマクロセットです。 ユーザが独自にエスケープシーケンスを作成できる場合というのは 非常に限られており、特殊文字のみマップすることができます。
groff 言語は、異なるインタフェースを持ついくつかの種類の変数を 提供しています。 定義済みの変数もありますが、ユーザも同様に自分で変数を定義できます。
文字列 変数は文字列を格納します。 この変数は \&\$*\& リクエストで設定され、値は \&\$*\& エスケープシーケンスを使って取り出します。
レジスタ 変数は数値、スケールファクタつき数字、 場合によっては文字列に似たオブジェクトを格納できます。 \&\$*\& リクエストで設定され、値は \&\$*\& エスケープシーケンスを使って取り出します。
環境 を使うことによって、行の長さやフォントサイズなどのような グローバルな整形パラメータを、後の再利用のために ユーザが一時的に格納することができます。 これは \&\$*\& リクエストによって行われます。
フォント は、名前もしくは内部番号のどちらかで判別されます。 現在のフォントは \&\$*\& リクエストもしくは \&\$*\& エスケープシーケンスで選択されます。 デバイスごとに特別フォントがありますが、次のフォントはすべての デバイスで利用可能です。 R は標準フォント、ローマン体です。 B はその ボールド体 です。 イタリック体 フォントは I と呼ばれておりどこででも利用可能ですが、テキストデバイスでは ローマン体フォントに下線がついたものとして表示されます。 グラフィカルの出力デバイスに対しては、次のフォントの固定幅の 修飾文字が存在します。 CR, CI, および CB です。 テキストデバイスでは、いずれにしても文字はすべて固定幅です。
さらに、roff の拡張要素がいくつかあります。 ディバージョン は、後で利用できるように情報をマクロに格納します。 トラップ は、ページの先頭から何行目とか、ディバージョンや入力において 何行目というような位置条件です。 アクションの中には、条件が揃ったときに自動的に起動するように 指示できるものがあります。
これより詳細な情報については、groff info ファイルに示されています。
ある条件下で特別な制御タスクをもつ文字が いくつかあります。
数値 は、符号つき整数、符号なし整数、浮動小数点実数のいずれか、 およびそれに単位指定子を付加したものです。 単位指定子 は、計測単位を表す 1 文字の略語です。 単位指定子が後についた数字は、サイズに関する値を意味しています。 デフォルトでは、数値は単位指定を持ちません。 つまり、単なる数字にすぎません。
roff 言語では、次の単位指定子を定義しています。
c | センチメートル |
i | インチ |
P | パイカ = 1/6 インチ |
p | ポイント = 1/72 インチ |
m | em = ポイント値でのフォントサイズ (文字 `m' の幅) |
M | em の 100 倍 |
n | en = em/2 |
u | 実際の出力デバイスでの基本単位 |
v | 基本単位での行送り幅 |
z | スケールされたポイント数 = 1 ポイントの 1/sizescale 倍 (フォントの DESC ファイルで定義) |
数式 は、先で定義された数値と算術演算子 \&\$*\& \&\$*\& \&\$*\& \&\$*\& \&\$*\& (剰余), 比較演算子 \&\$*\& ( \&\$*\& と同じ), \&\$*\& \&\$*\& \&\$*\& \&\$*\& 論理演算子 \&\$*\& (論理積), \&\$*\& (論理和), \&\$*\& (否定), および括弧 \&\$*\& と \&\$*\& との組み合わせです。
さらに、 groff は、数式に対して次の演算子を追加しました。
e1>?e2 | e1 と 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 では、リクエストとマクロの名前を任意の長さにすることができます。 長い名前に対して括弧で括ったりマークをつける必要はありません。
たいていのリクエストは 1 つ、ないしは複数の引数をとります。 引数は空白文字で区切られます (タブではありません!)。 引数の長さや数について、固有の制限はありません。 引数はダブルクォートで括ることができます。 引数に空白文字が含まれる場合にとても便利です。 例えば、 \&\$*\& は 1 つの引数を表しています。
リクエストの中には、引数を与えると、引数なしの場合と異なった動きを するものがあります。 その詳細すべてについては、ここでは説明しません。 詳細は、groff info ファイルを参照してください。
後に述べるリクエストの説明では、引数の名前の多くは その意味を表すように選ばれています。 次にあげる表記についてだけは、意味を明らかにする必要があるでしょう。
c | 1 文字を表します。 |
font | フォント名あるいはフォント番号で指定されたフォント |
anything | 行末までのすべての文字、あるいは \{ と \} に囲われた文字 |
n | 評価されると整数値を返す数式 |
N | 符号つきまたは符号なしの任意の数式 |
±N | 符号によって 3 つの意味があります。 次に説明をします。 |
\&\$*\& で定義された式が \&\$*\& 符号で始まる場合、この式の結果の値は、関連するリクエストが すでに持っている固有値に加算されます。 例えば、数値レジスタに加算されます。 式が \&\$*\& で始まる場合、この式の結果の値は、リクエストの値から減算されます。
符号がない場合は、既存の値を \&\$*\& で直接置き換えます。 負の値を指定する場合は、 \&\$*\& を前に置くかあるいは負の値を括弧で括ってください。
これらの基本的な 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 文字のエスケープシーケンスを 表すものではなく、2 つ以上の文字を持ったエスケープ名の 開始を示します。
バックスラッシュの後に定義済みのエスケープシーケンスを 形成しない文字が続く場合は、バックスラッシュは黙って無視され、 文字そのものがマップされます。
よく使われる特殊文字は、文字 \&\$*\& と \&\$*\& を用いた \&\$*\& の形式のエスケープシーケンスであらかじめ定義されています。 特殊文字の中には通常のフォントに含まれているものも一部ありますが、 ほとんどは特別フォントでしか利用できません。 最も重要なグリフを抜き出したものを次に示します。 完全なリストは、 groff_char(7) にあります。
レジスタは値を格納する変数です。 groff では、ほとんどのレジスタは数値を格納しますが (前述セクション 数式 を参照してください)、なかには文字列値を保持できるものもあります。
各レジスタには名前が与えられています。 任意のレジスタを定義でき、リクエスト \&\$*\& \&\$*\& で定義・設定できます。
レジスタに格納された値は、エスケープシーケンス \&\$*\& を用いて取り出すことができます。
最も有用なのは、定義済みのレジスタです。 次からは、レジスタのことを話しているのだということを明確にするため、 \&\$*\& という表記を用いて \&\$*\& レジスタのことを示します。 \&\$*\& 修飾はレジスタ名の一部ではないことを気にとめておいてください。
次のレジスタは、ユーザが書き換えられない定義済みの値を持った レジスタです (通常、ドットで始まるレジスタは読み込み専用です)。 ほとんどは、現在の設定についての情報を提供したり、リクエスト呼び出し からの結果を保存したりするものです。
次のレジスタは、ユーザによって読み書き可能です。 定義済みのデフォルト値を持っていますが、ドキュメントを カスタマイズするために変更できます。
groff が生成する警告は各々名前およびコード番号で識別されます。 コードは 2 の累乗になっていて、1 つの整数の上にビットエンコード できるようになっています。 また警告のグループを参照するのに使用することのできる名前もあります。
警告と関連のある名前は、 \&\$*\& および \&\$*\& オプションで使用されます。 コード番号は リクエスト \&\$*\& および \&\$*\& レジスタで使用されます。
Bit | Code | 警告 | Bit | Code | 警告 | Bit | Code | 警告 |
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 は、古典的な troff 用に書かれた roff コードや他の roff 実装用の roff コードを同じ方法で 処理できるようにする 互換モード を提供します。
互換モードはコマンドラインオプション \&\$*\& を用いて有効にでき、リクエスト \&\$*\& で有効にしたり無効にしたりできます。 番号レジスタ \&\$*\& は、互換モードが有効であるとき \&\$*\& で、無効であるとき \&\$*\& です。
長い名前に対する GNU の考え方によってある種の非互換性が 生まれてしまうのでこれが必要になりました。 古典的な troff は、
を cd という中身を持った文字列 ab を定義しているものとして解釈します。 groff は、通常これを \&\$*\& という名前のマクロ呼び出しとして解釈します。
さらに、 古典的な troff では \&\$*\& または \&\$*\& を \&\$*\& と呼ばれる文字列レジスタあるいは番号レジスタへのリファレンスとして 解釈します。 しかし、 GNU 独自の モード では通常これを長い名前の始まりとして解釈してしまいます。
互換性 モードでは、 groff はこれらを古典的な方法で解釈するようになりますが、長い名前は 認識されなくなります。
これに対して、 GNU 独自モード での groff は、文字列やマクロ、変換、番号レジスタ、フォントあるいは 環境名にエスケープシーケンス \&\$*\& \&\$*\& \&\$*\& \&\$*\& \&\$*\& \&\$*\& \&\$*\& \&\$*\& \&\$*\& \&\$*\& \&\$*\& \&\$*\& \&\$*\& \&\$*\& を使うことはできません。 これに対して 古典的な troff ではこれらのエスケープシーケンスを使えます。 エスケープシーケンス \&\$*\& は、名前の中でこれらのエスケープシーケンスを使わないようにするとき 役に立ちます。
小数のポイントサイズは、顕著な非互換性を生み出します。 古典的な troff では、 \&\$*\& リクエストは単位指定子を無視しますので、
.ps 10u
とするとポイントサイズを 10 ポイントに設定します。 これに対して groff 独自のモードでは、ポイントサイズは スケールポイントで 10 ポイントに設定します。
groff モードでは、整形されていない入力と整形された出力文字との間に 基本的な違いがあります。 出力文字がどのように出力されるかに影響を与えるものは、 すべてその文字と一緒に格納されます。 一度出力文字が作られれば、 その後でどのようなリクエストが実行されても出力文字は影響を受けません。 \&\$*\& \&\$*\& \&\$*\& \&\$*\& \&\$*\& のいずれのリクエストでも同様です。
通常、出力文字は、入力文字を現在の出力行に追加する直前に作られます。 マクロ、ディバージョン、文字列は、実はすべて 同じオブジェクトタイプです。 これらは、どのような組み合わせでも入力文字のリスト ならびに出力文字のリストを持っています。
マクロを処理する目的では、出力文字は入力文字と同じような 振る舞いはしません。 出力文字は、自分の構築元となった入力文字ならば持っていたであろう 特別な属性を一切引き継ぎません。 次の例は、これらのことをもっと明解に示しています。
.di x \\\\ .br .di .x
GNU モード では、これは \&\$*\& として表示されます。 つまり、入力されたバックスラッシュの対 \&\$*\& はそれぞれ 1 つのバックスラッシュ \&\$*\& に変換されます。 そして、結果として出力されるバックスラッシュは、 再度読み込まれるときにはエスケープ文字としては解釈されません。
古典的な troff では、こうしたバックスラッシュは再度読み込まれるときには エスケープ文字として解釈されるので、最終的には 1 つのバックスラッシュ \&\$*\& として出力されるでしょう。
出力可能な \&\$*\& を得る正しい方法は エスケープシーケンス \&\$*\& を使うことでしょう。 これは、ディバージョン内で使用されているかどうかに関わらず、 現在のエスケープ文字を常に 1 つだけ出力します。 さらにこれは 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 言語拡張の不可欠な部分を含んではいますが、 詳しい説明については、groff info ファイルの中にあります。
groff 言語の主な情報源は groff info(1) ファイルです。
roff および groff システムを調べたり、さらなるドキュメントへの ポインタを得るには、 roff(7) を参照してください。
フォーマッタプログラムについては groff(1) および troff(1) で説明されており、 前もって定義されているグリフ名のすべては groff_char(7) で説明されています。
古くからある troff のドキュメントはオンライン
http://cm.bell-labs.com/cm/cs/cstr.html
6 August 2001 | Groff Version 1.17.2 |