troff ( / ˈ tiː r ɒ f / )は、「タイプセッター roff」の略で、ベル研究所がUnixオペレーティングシステム向けに開発した文書処理システムの主要コンポーネントです。troff と関連するnroff はどちらも、オリジナルのroffから開発されました。
nroffは端末やラインプリンタへの出力を目的としていたのに対し、troffは組版システム、特に1972年に導入されたGraphic Systems CATへの出力を目的としていた。どちらも同じ基盤となるマークアップ言語を使用しており、単一のソースファイルは通常、変更せずにnroffとtroffの両方で使用できた。
troffには、フォント、間隔、段落、余白、脚注などを指定するコマンドが備わっています。他の多くのテキストフォーマッタとは異なり、troffはページ上の文字を任意の位置に配置でき、文字を重ねることも可能です。また、完全にプログラム可能な入力言語を備えています。表、図、数式をより簡単に作成するために、専用のプリプロセッサが使用されます。troffへの入力はプレーンテキストファイルで、任意のテキストエディタで作成できます。
さまざまな文書スタイルに対応した豊富なマクロパッケージが作成されています。troffの一般的な配布パッケージには、研究論文の書式設定用のmeマクロ、Unixのマニュアルページを作成するためのmanおよびmdocマクロ、マウント可能な透明シートを作成するためのmvマクロ、そして手紙、書籍、技術メモ、レポートを作成するためのmsおよびmmマクロが含まれています。
troffの起源は、1960年代半ばにジェローム・H・ソルツァーがMITのCTSSオペレーティングシステム向けに作成したRUNOFFというテキスト整形プログラムに遡る。(この名前は「I'll run off a document」(文書を走り切る)というフレーズに由来すると言われている。)
ボブ・モリスはこのプログラムをGE 635アーキテクチャに移植し、 roff ( runoffの略)と名付けた。その後、 PDP-7向けにrfとして書き直され、同時期(1969年)、ダグ・マキロイはBCPLプログラミング言語でroffの拡張版および簡略版を書き直した。
Unixの最初のバージョンは、ベル研究所にあった PDP-7 上で開発されました。1971 年、開発者たちはオペレーティングシステムのさらなる開発のためにPDP-11を入手したいと考えました。このシステムの費用を正当化するために、彼らはベル研究所の特許部門向けに文書フォーマットシステムを実装することを提案しました。[ 1 ]この最初のフォーマットプログラムは、McIllroy のroffを再実装したもので、 Joe F. Ossannaによって書かれました。
より柔軟な言語が必要になったとき、roffの新しいバージョンであるnroff (新しい "roff" ) が作成され、これが将来のすべてのバージョンの基礎となりました。Graphic Systems CAT フォトタイプセッターを入手したとき、Ossanna はnroff を複数のフォントと比例間隔をサポートするように変更しました。タイプセッター roff の頭文字をとってtroffと名付けられたその洗練された出力は、タイプセッターの製造元を驚かせ、troffを使用した原稿が以前に出版されたことがあると考えた査読者を混乱させました。[ 2 ] [ 3 ]そのため、troffという名前は/ ˈ t iː r ɒ f /ではなく/ ˈ t r ɒ f /と発音されます。
troffと同時にnroffが登場しました(実際にはほぼ同じプログラムでした)。nroffはラインプリンタや文字端末への出力を行うためのプログラムでした。troffが行うすべての処理を理解し、フォント変更など適用できないコマンドは無視しました。
Ossanna のtroff はPDP-11アセンブリ言語で書かれ、 CAT フォトタイプセッター専用の出力を生成していました。彼はそれをCで書き直しましたが、今度は 7000 行のコメントのないコードになり、依然として CAT に依存していました。CAT があまり普及しなくなり、メーカーによるサポートも終了したため、他のデバイスをサポートする必要性が優先事項となりました。Ossanna はこの作業が完了する前に亡くなったため、Brian Kernighan がtroffの書き直しを引き受けました。新しく書き直されたバージョンは、デバイスに依存しないコードを生成し、ポストプロセッサが読みやすく、適切なプリンタ コードに変換しやすくなりました。また、この新しいバージョンのtroff (デバイス非依存 troffのditroffと呼ばれることが多い) には、描画機能を含むいくつかの拡張機能がありました。[ 4 ]プログラムのドキュメントではditroff の出力形式が定義されており、これは GNU groffのような多くの最新のtroffクローンで使用されています。
1983年当時、troffはベル研究所のライセンスの下、チャールズ・リバー・データ・システムズのUNOSオペレーティングシステムで利用可能なUNIXツールの1つでした。[ 5 ]
troffツール群(プリプロセッサとポストプロセッサを含む)は最終的にDocumenter's WorkBench (DWB)と呼ばれるようになり、ベル研究所、そして後にスピンオフしたUnix System Laboratories(USL)で1994年まで継続的に開発が続けられました。当時、SoftQuadがメンテナンスを引き継ぎましたが、Brian Kernighanは個人的にtroffの改良を続けました。そのため、オリジナルのベル研究所troffには、少なくとも以下の派生バージョンが存在します。
troffはInterleaf、FrameMaker、LaTeXなどの他のプログラムに取って代わられつつあるものの、依然としてかなり広く利用されている。UNIXドキュメントのデフォルトフォーマッタとして今も使われている。
このソフトウェアは、 1990年からGNUシステム向けにgroffとして再実装されました。さらに、Ancient UNIXシステムのオープンソース化、およびOpenSolarisやBell LabsのPlan 9に見られるditroffベースのオープンソース版などの現代の後継システムにより、さまざまなオープンソースライセンスの下で利用可能なAT&T troff(CATおよびditroffベース[ 6 ])のいくつかのバージョンが存在します。
一般的に、troff を直接使用することは推奨されず、より使いやすいインターフェースを経由することが推奨されていました。[ 7 ] [ 8 ] troff には、ドキュメントの処理を開始する前に実行されるマクロが含まれています。これらのマクロには、ページ ヘッダーとフッターの設定、新しいコマンドの定義、出力のフォーマット方法への影響などが含まれます。マクロ セットを含めるためのコマンドライン引数は であり、これにより、多くのマクロ セットは、先頭にmが付いた基本ファイル名として知られるようになりました。[ 9 ]-mname
先頭にmが付いた標準マクロセットは以下のとおりです。
ms マクロは、AT&T で開発された最初のマクロで、その後 mm マクロに取って代わられました。[ 18 ] mm マクロの目標の 1 つは、ベル研究所のタイピング プールで使用できることであり、時間が経つにつれてこれが実現し、mm マクロはベル研究所の標準となりました。[ 19 ] AT&T は、System V Unix 用に mm マクロを商用で提供しました。[ 18 ]対照的に、me マクロはバークレーで開発されました。[ 18 ]
mmマクロを使用して作成されたシンプルなビジネスレターの例は次のとおりです。
.TL.ND"January 10, 1993".AU"Ms. Jane Smith".AT"Upcoming appointment".MT5参照番号:A12345.sp4サミュエル・ジョーンズ氏.sp0検査局現場責任者.sp01010 政府広場.sp0キャピトルタウン、セント.sp3ジョーンズ様.sp2.P新たに開発した生産工程を国家検査に提出するという義務について言及しつつ、明日の革新的な技術を、過去の時代遅れの要件に晒すことの不適切さについてご検討いただきたく存じます。我が国が21世紀に繁栄するためには、対策を講じる必要があります。.B今 、 で.Iこれ の年.Iこれ この10年間は、必ずや到来するであろう州間および国際競争に備え、我が国の産業基盤を整備するための期間でした。私たちの新しいプロセスはまさにそれを実現するものです。もはや適切ではない規制環境によって、このプロセスが無駄にならないよう、どうかご配慮ください。.P弊社の立場をご検討いただき、ありがとうございます。.FCSincerely.SG
troff の進化に伴い、 troffでは容易に実行できないことがいくつかあるため、複数のプリプロセッサが開発されました。これらのプログラムは、ドキュメントの特定の部分をtroff入力に変換し、Unix の「パイプライン」の使用に自然に適合します。パイプラインとは、あるプログラムの出力を別のプログラムへの入力として送信することです (パイプとフィルタを参照)。通常、各プリプロセッサは、入力ファイルのうち特別にマークされた部分のみを変換し、ファイルの残りの部分は変更せずにそのまま渡します。組み込みのプリプロセッシング命令は、シンプルなアプリケーション固有プログラミング言語で記述されており、高いパワーと柔軟性を提供します。
3つのプリプロセッサは、画像を記述するためのドメイン固有言語を定義することで、 troffに描画機能を提供する。
さらに、入力テキストから包含指示を削除するコマンドsoelimがあります。 [ 24 ].so
パイプラインの典型的な構造は次のようになる。
soelim file | refer | ideal | pic | tbl | eqn | troff
さらに、より多くのプリプロセッサは、 picの出力を生成することで、より複雑な画像を描画することを可能にします。
troffとのより親しみやすいインターフェースとなることを目的とした、他のいくつかのフロントエンドも開発されている。
その一つがSanscribeで、元々はバークレーで開発され、その後1980年代にIntelや InterACTを含む複数のユーザーによって改良されました。メモ、レポート、文書の作成に使用されるSanscribeは、基本的なtroffコマンド、meマクロ、およびsoelim、eqn、tbl、grap、picなどのさまざまなプリプロセッサとポストプロセッサに基づいて構築されています。ただし、これはプリプロセッサではなく、メインプログラムのバイナリです。条件付きインクルード機能により、マルチプラットフォームのリファレンスマニュアルの保守に特に役立ちます。しかし、Sanscribeは不安定で、不可解なエラーが発生したり、奇妙な形式の結果を生成したりする可能性があります。[ 28 ]
特殊なフロントエンドとしてvgrindがあり、コメントをイタリック体、キーワードを太字、関数名を余白で強調表示するなどの機能を備えた、見やすくフォーマットされたソース プログラム リストを生成します。フィルタとして、または出力を troff に渡すメイン プログラムとして実行できます。Fortran、C 、 C ++だけでなく、 Bourne シェルやyaccなどのドメイン固有のツール、さらにEmacs LispやIconなどのより広範なツールを含む、ベル研究所で使用されている言語をサポートしています。[ 24 ]
CADiZスイートのツールでは、 Z 表記法に対して異なるアプローチが採用されています。このcadizプログラムはパイプラインの先頭にあるプリプロセッサではなく、パイプではなく保存されたファイルを使用して、入力と出力の両方として複数回やり取りします。CADiZ には、とtroff呼ばれる独自のマクロセットも含まれています。[ 29 ].ZA.ZZ