LinuxでPDFドキュメントをフォーマットするためのTroffの使い方

TroffはLinuxシステム用の最小限でありながら強力なドキュメントテキストプロセッサです。コマンドラインからソースファイルをコンパイルすることで、印刷可能なドキュメントを簡単に作成できます。LaTeXとは異なり、Troffは非常に軽量で、ほとんどのLinuxシステムにプリインストールされています。このチュートリアルでは、UbuntuでPDFドキュメントをフォーマットするためのTroffの使い方を説明します。
目次
- Troffとは何か、なぜ使うのか
- Troffのインストール
- 最初のTroffドキュメントを作成する
- Troffフォーマットの理解
- 太字、イタリック、下線のテキストを作成する
- 新しいドキュメントセクションを作成する
- Troffでリストを作成する
- Troffでプリプロセッサを使ってテーブルを作成する
- よくある質問
Troffとは何か、なぜ使うのか
基本的に、Troffはコードのようなスクリプトを印刷可能なドキュメントに変換するテキスト処理プログラムです。ワードプロセッサとは異なり、Troffは「WYSIWYG」パラダイムに依存していません。代わりに、特定のタイプのコードを使用してフォーマットを処理する必要があります。

このアプローチの最大の利点の1つはシンプルさです。Troffの基本インストールには、ドキュメントを作成するために必要なすべてが含まれています。さらに、グラフィカルユーザーインターフェースがないため、SSH経由でもドキュメントを作成できます。

ヒント: LinuxでSSH経由でGUIアプリケーションを転送する方法を学びましょう。
Troffのインストール
TroffはほとんどのLinuxディストリビューションにデフォルトでバンドルされています。システムにインストールされているかどうかを確認するには、-hフラグを実行します。これにより、Troffインストールが受け入れるすべてのフラグの簡単なリストが表示されます。
troff -h
ディストリビューションによっては、デフォルトでTroffがバンドルされていない場合があります。その場合は、「groff」パッケージを探してインストールできます。

これはGNUプロジェクトによるTroffおよびNroffプログラムの再実装であり、多くの新しい機能が含まれています。
Ubuntuでgroffをインストールするには、次のコマンドを使用します:
sudo apt install groff
最初のTroffドキュメントを作成する
ソースコードと同様に、すべてのTroffドキュメントはドキュメントを作成する方法に関する指示を含むテキストファイルです。これには、ページと余白の幅、文字とページの間隔が含まれます。

この制御レベルにより、プログラムを操作して任意の種類のドキュメントを作成できます。それを簡素化するために、Troffの開発者はこれらのコマンドをより簡単な構文に凝縮する「マクロ」を作成しました。

Troffで使用する最も一般的なマクロの1つは「ms」です。これは、記事スタイルのドキュメントを作成します。touchコマンドを使用してmsドキュメントを作成できます:
touch my-first-document.msすべてのTroffドキュメントはテキストであるため、テキストエディタを使用してドキュメントを開くことができます。私の場合、vimを使用しています。あるいは、Linux用のこれらのテキストエディタのいずれかを使用できます。
vim my-first-document.ms
Troffフォーマットの理解
すべてのTroffドキュメントは類似の構造に従います。行うすべてのフォーマットコマンドは、フォーマットしようとしているコンテンツの別の行にある必要があります。そのため、典型的なTroffドキュメントは次のようになります:
.COMMAND1
This is a piece of content in a Troff document.
.COMMAND2
This is a different piece of content in a Troff document.msで使用する最も基本的なコマンドの2つは、.TLと.PPです。前者はテキストをタイトルに変換し、ドキュメント内で中央に配置します。一方、後者はテキストを段落のようなスタイルにフォーマットします。
たとえば、次の抜粋では、.TLと.PPの両方のコマンドを使用しています:
.TL
My First Troff Document
.PP
This is content that I want to look like a paragraph in my final document. It is not a very long content but it is my first Troff document and it is something that I am proud of. It is about three sentences long and it should wrap around the document properly.
ここから、ファイルをTroffプログラムに渡してドキュメントを作成します。
groff -ms-Tpdf ./my-first-document.ms > output.pdf
ヒント: よりシンプルなものを好む場合は、Google DocsでMLAフォーマットで書く方法を学びましょう。
太字、イタリック、下線のテキストを作成する
通常のワードプロセッサと同様に、ほとんどのTroffマクロはドキュメントをカスタマイズするためのスタイルコマンドをいくつか提供します。msの場合、これらは.B、.I、.UL、および.BXです。
.Bコマンドはテキストを太字に変更します。.Iコマンドはテキストをイタリックに変更します。.ULと.BXは、それぞれテキストの下に下線を引き、ボックスを描画するコマンドです。
上記のコマンドと同様に、これらをドキュメントで使用するには、各スタイルを別の行に分ける必要があります:
.TL
My First Troff Document
.PP
This is
.B
content
.R
that I want to look like a paragraph in my final document. [...]この例では、「content」という単語の前に新しい行を作成し、.Bコマンドを追加して太字に変更し、その後新しい行を作成して.Rコマンドを追加しました。これにより、Troffは以前のスタイルに戻ります。

スタイルを変更する際には、常に.Rコマンドを追加する必要があることに注意してください。たとえば、次の抜粋では、Troffがその後に.Rを見なかったため、.Iコマンドを終了しません:
.TL
My First Troff Document
.PP
This is
.I
content
that I want to look like a paragraph in my final document. [...]
新しいドキュメントセクションを作成する
LaTeXと同様に、Troffもセクションと階層検出をサポートしているため、編集時に各ヘッダーのレベルを整理して一致させる必要はありません。
ドキュメントに新しいセクションを作成するには、.NHコマンドを使用し、その後にヘッディングの名前を続けます。
.TL
My First Troff Document
.NH
My First Heading
.PP
This is content that I want to look like a paragraph in my final document.
デフォルトでは、すべてのTroffヘッダーには、プログラムが最終ドキュメントでコンテンツを構造化して表示する方法を決定するレベル値があります。それを知っていると、この値を変更してヘッディングのレベルを調整できます。
たとえば、次のように、親のすぐ下にレベル2のヘッディングを作成します:
.TL
My First Troff Document
.NH
My First Heading
.NH 2
My First Subheading
.PP
This is content that I want to look like a paragraph in my final document.
通常の番号付きヘッダーに加えて、Troffはドキュメントのレベル階層に従う空白のヘッダーも作成できます。
これを行うには、.NHを.SHコマンドに置き換えます:
.TL
My First Troff Document
.SH
My First Heading
.SH 2
My First Subheading
.PP
This is content that I want to look like a paragraph in my final document.
ヒント: Google Docsで余白を変更する方法を見つけましょう。
Troffでリストを作成する
Troffのシンプルさは、その動作を必要に応じて調整できることも可能にします。たとえば、リストはTroffやmsマクロにデフォルトで付属していません。それにもかかわらず、いくつかのmsコマンドを組み合わせることでリストを作成できます。
Troffのすべてのリストは、インデント、バレット、およびコンテンツの3つの部分で構成されます。インデントを作成するには、.RSおよび.REコマンドを使用します。これにより、その中のテキストの現在のインデントレベルが4スペースだけ移動します。
.RS
This is my first item.
.RE
次に、リストアイテムのバレットを作成するには、.IPを使用します。これは「インデント段落」コマンドで、テキストの左余白を特定の幅に固定します。
.IPコマンドは、カスタムバレットポイントとそれとテキストの間のスペースを設定することもできます。この場合、バレットを「[1]」に設定し、4スペースを与えます。
.RS
.IP [1]4
This is my first item.
.RE
次に、追加のリストアイテムを作成するために.IPコマンドをコピーして貼り付けます。
.RS
.IP [1]4
This is my first item.
.IP [2]4
This is my second item.
.IP [3]4
This is my third item.
.RE
最後に、カスタムマクロを作成してこのプロセスを自動化します。たとえば、次の抜粋では、.IPコマンドを.QWにバウンドしています:
.de QW
.IP [-]4
..
.RS
.QW
This is my first item.
.QW
This is my second item.
.QW
This is my third item.
.RE
Troffでプリプロセッサを使ってテーブルを作成する
Troffの特異な点は、そのほとんどの機能が「プリプロセッサ」として存在することです。ほとんどの場合、これらはプログラムの外部にあるバイナリで、「プリプロセッサコンテナスクリプト」を作成し、それを低レベルのTroffコードに変換することで機能します。

TblはTroffプリプロセッサの優れた例です。これは、ドキュメント内のテーブルを管理するプログラムです。基本的なTblコンテナは次のようになります:
.TS
allbox ;
c c c.
item1 item2 item3
item4 item5 item6
.TE .TSおよび.TEコマンドは、Tblにこれが読み取れる環境であることを示します。- 2行目は、プログラムにこのテーブルをどのようにフォーマットするかを指示します。
- 3行目は、列の数とその整列を決定するスペース区切りのフィールドです。
- 4行目と5行目は、テーブルの内容を含むタブ区切りのフィールドです。

Tblを使用してドキュメントをコンパイルするのは、通常のTroffファイルとは少し異なります。まず、ファイルを読み込みます:
tbl my-first-document.ms > preprocessed.ms次に、プログラムの出力をTroffに渡します:
groff -ms-Tpdf ./preprocessed.ms > output.pdf最後に、UNIXパイプを使用してこのプロセスを自動化します:
tbl my-first-document.ms | groff -ms-Tpdf> output.pdf
知っておくべきこと: sedを使用してUNIXパイプとファイルリダイレクションについてもっと学びましょう。
よくある質問
TroffをWindowsで使用することは可能ですか?
デフォルトでは、TroffやGroffはWindowsに公式に移植されていません。それにもかかわらず、Windows Subsystem for Linuxをインストールすることで、Groffや他のGNUユーティリティを使用できます。
Troffには文献追跡機能がありますか?
はい。Referは、外部文献ファイルを使用してTroffドキュメント内の参照を自動的に追跡するシンプルなプリプロセッサです。man referを実行してその動作についてもっと学ぶことができます。
Troffをコンパイルする際に「missing DESC」エラーを修正するにはどうすればよいですか?
この問題は、おそらくシステム内の依存関係が不足しているか、バージョンファイルが不一致であることが原因です。これを修正するには、ディストリビューションのリポジトリから適切なgroffパッケージをインストールしてください。
画像クレジット: Simon Hattinga Verscheure via Unsplash。すべての変更とスクリーンショットはRamces Redによるものです。