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

ノートパソコンのキーボードでタイピングしている人の手の写真。

TroffはLinuxシステム用の最小限でありながら強力なドキュメントテキストプロセッサです。コマンドラインからソースファイルをコンパイルすることで、印刷可能なドキュメントを簡単に作成できます。LaTeXとは異なり、Troffは非常に軽量で、ほとんどのLinuxシステムにプリインストールされています。このチュートリアルでは、UbuntuでPDFドキュメントをフォーマットするためのTroffの使い方を説明します。

目次

  • Troffとは何か、なぜ使うのか
  • Troffのインストール
  • 最初のTroffドキュメントを作成する
  • Troffフォーマットの理解
  • 太字、イタリック、下線のテキストを作成する
  • 新しいドキュメントセクションを作成する
  • Troffでリストを作成する
  • Troffでプリプロセッサを使ってテーブルを作成する
  • よくある質問

Troffとは何か、なぜ使うのか

基本的に、Troffはコードのようなスクリプトを印刷可能なドキュメントに変換するテキスト処理プログラムです。ワードプロセッサとは異なり、Troffは「WYSIWYG」パラダイムに依存していません。代わりに、特定のタイプのコードを使用してフォーマットを処理する必要があります。

デフォルトのLibreoffice Writer画面。

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

Troffを実行しているリモートOpenBSDセッション。

ヒント: LinuxでSSH経由でGUIアプリケーションを転送する方法を学びましょう。

Troffのインストール

TroffはほとんどのLinuxディストリビューションにデフォルトでバンドルされています。システムにインストールされているかどうかを確認するには、-hフラグを実行します。これにより、Troffインストールが受け入れるすべてのフラグの簡単なリストが表示されます。

troff -h

Troffで-hフラグを実行しているターミナル画面。

ディストリビューションによっては、デフォルトでTroffがバンドルされていない場合があります。その場合は、「groff」パッケージを探してインストールできます。

groffのapt infoコマンドを実行しているターミナルウィンドウ。

これはGNUプロジェクトによるTroffおよびNroffプログラムの再実装であり、多くの新しい機能が含まれています。

Ubuntuでgroffをインストールするには、次のコマンドを使用します:

sudo apt install groff

groffのapt installコマンドを表示しているターミナルウィンドウ。

最初のTroffドキュメントを作成する

ソースコードと同様に、すべてのTroffドキュメントはドキュメントを作成する方法に関する指示を含むテキストファイルです。これには、ページと余白の幅、文字とページの間隔が含まれます。

複雑なTroffマクロを表示しているターミナルウィンドウ。

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

install troff linux 08 ms macros manual 609x400

Troffで使用する最も一般的なマクロの1つは「ms」です。これは、記事スタイルのドキュメントを作成します。touchコマンドを使用してmsドキュメントを作成できます:

touch my-first-document.ms

すべてのTroffドキュメントはテキストであるため、テキストエディタを使用してドキュメントを開くことができます。私の場合、vimを使用しています。あるいは、Linux用のこれらのテキストエディタのいずれかを使用できます。

vim my-first-document.ms

新しい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ドキュメントを表示しているターミナルウィンドウ。

ここから、ファイルをTroffプログラムに渡してドキュメントを作成します。

groff -ms-Tpdf ./my-first-document.ms > output.pdf

基本的なTroffドキュメントの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は以前のスタイルに戻ります。

太字の単語を表示しているTroffドキュメントのPDF出力。

スタイルを変更する際には、常に.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. [...]

ほとんどの本文がイタリック体で表示されているTroffドキュメントのPDF出力。

新しいドキュメントセクションを作成する

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ドキュメントのPDF出力。

デフォルトでは、すべての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ドキュメントのPDF出力。

通常の番号付きヘッダーに加えて、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.

番号なしのネストされたヘッディングを表示しているTroffドキュメントのPDF出力。

ヒント: Google Docsで余白を変更する方法を見つけましょう。

Troffでリストを作成する

Troffのシンプルさは、その動作を必要に応じて調整できることも可能にします。たとえば、リストはTroffやmsマクロにデフォルトで付属していません。それにもかかわらず、いくつかのmsコマンドを組み合わせることでリストを作成できます。

Troffのすべてのリストは、インデント、バレット、およびコンテンツの3つの部分で構成されます。インデントを作成するには、.RSおよび.REコマンドを使用します。これにより、その中のテキストの現在のインデントレベルが4スペースだけ移動します。

.RS  
This is my first item.  
.RE

シンプルなリストアイテムを表示しているTroffドキュメントのPDF出力。

次に、リストアイテムのバレットを作成するには、.IPを使用します。これは「インデント段落」コマンドで、テキストの左余白を特定の幅に固定します。

.IPコマンドは、カスタムバレットポイントとそれとテキストの間のスペースを設定することもできます。この場合、バレットを「[1]」に設定し、4スペースを与えます。

.RS  
.IP [1]4  
This is my first item.  
.RE

バレットポイント付きの単一リストアイテムを表示しているTroffドキュメントのPDF出力。

次に、追加のリストアイテムを作成するために.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

バレットポイント付きの3つの基本リストアイテムを表示しているTroffドキュメントのPDF出力。

最後に、カスタムマクロを作成してこのプロセスを自動化します。たとえば、次の抜粋では、.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コードに変換することで機能します。

プリプロセッサから変換されたTroffコードを表示しているターミナルウィンドウ。

TblはTroffプリプロセッサの優れた例です。これは、ドキュメント内のテーブルを管理するプログラムです。基本的なTblコンテナは次のようになります:

.TS  
allbox ;  
c c c.  
item1  item2  item3  
item4  item5  item6  
  
.TE
  • .TSおよび.TEコマンドは、Tblにこれが読み取れる環境であることを示します。
  • 2行目は、プログラムにこのテーブルをどのようにフォーマットするかを指示します。
  • 3行目は、列の数とその整列を決定するスペース区切りのフィールドです。
  • 4行目と5行目は、テーブルの内容を含むタブ区切りのフィールドです。

Tblのプリプロセッサスクリプトを表示しているターミナルウィンドウ。

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

基本的なテーブルを表示しているTroffドキュメントの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によるものです。