roff - roff
排版系統的概念和歷史
roff
是一系列排版程式,如
troff,
nroff,
ditroff,
groff,
等等的通稱。 一個 roff
排版系統包含一個可擴充套件的文字格式化語言和一系列程式用以列印和轉換為其他文字格式。
傳統的,它是 Unix
的主要文字處理系統;現在,每個
類Unix
作業系統仍然附帶一個
roff
系統作為核心軟體包。
當今最普遍的 roff
系統是自由軟體的實現
GNU roff,
groff(1). groff
之前的實現被稱為傳統的
classical 實現 (從 1973
年開始)。
groff
實現了它的傳統的前輩的用法和功能,並且加入了更多擴充套件。
當前,由於
groff
是唯一可以在 (幾乎是)
任何計算機系統上都可用的
roff
系統,因此它是事實上的
roff 標準。
在一些古老的 Unix
系統中,有一個叫做
roff
的可執行檔案,實現了甚至更加古老的
Multics 作業系統中的
runoff
。 參見
HISTORY 段落。
它的功能非常有限,即使與古老的
troff
相比;它不再被支援了。
因此,在本文件中,
roff 總是泛指 roff 系統
roff
system ,不是古老的 roff
可執行檔案
儘管歷史悠久,roff
當前還在廣泛使用中,例如,UNIX
系統的手冊頁 (
man pages)
,很多軟體書籍,系統文件,標準和團體組織的文件都是用
roff 來寫的。 roff
在文字裝置上的輸出效果仍然是無可比擬的,
並且,與其他自由的排版系統相比,它的圖形輸出也不差,
甚至強於很多商業的系統
最普遍的 roff
的應用是手冊頁
manual pages
(簡稱
man pages)
;
它是很多作業系統中的標準文件系統
此文件描述了圍繞
roff
system
開發的一些歷史事件;
所有 roff
版本在用法方面的一些共同點,
roff
管道的細節--它經常被掩蓋在類似
groff(1) 等等的 “前端”
之後;
對排版語言的一般的概述;
一些寫 roff 文件的技巧;
還有到更多資料的連結
roff
文字處理系統有很長的一段歷史,可以回溯到60
年代。 roff 系統自身與 Unix
作業系統關係密切,
但是它的起源要從更早的作業系統
CTSS 和 Multics 開始。
roff
系統的演變與作業系統的歷史緊密聯絡。
它的 “先祖”
runoff 是
Jerry Saltzer 在
CTSS 作業系統
(
Compatible Time Sharing System
,相容分時系統 (?),1961)
上的作品。 CTTS
後來發展成為作業系統
Unix
的一個著名的來源,出現於
1963,同時
runoff
成為文件和文字處理的主要格式。
當時,這兩種作業系統只能執行在非常昂貴的計算機之上,
因此它們大部分用於研究和官方及軍隊的任務之中
與現代的 roff 相比,
runoff
語言可以做的事非常有限。
在 60
年代,只能產生文字的輸出。
這可以用一個長度為 2
的命令 (request)
的集合實現,
這些命令的絕大部分都保持不變地被
roff 採用。
這種語言的模型是根據
“前計算機時代”
的排版習慣而建立的,
那時,以點 (dot, `.')
開頭的行被寫在手稿中,
向之後進行手工排版工作的工人指示格式化的要求
開始,runoff 程式是用
PL/1
語言寫成的,後來用
BCPL 來寫--那是
C 程式語言的
“祖母”。 在 Multics
作業系統中,幫助系統由
runoff 來處理, 與 roff 管理 Unix
手冊頁的作用類似。
仍然有 runoff
語言寫成的文件,
例如可以到 Saltzer
的主頁看看。參見
SEE
ALSO 段
在 70 年代,Multics 的後裔 (offspring)
Unix
變得越來越普遍,因為它可以執行在廉價的計算機上,
並且那時在大學裡可以很容易地獲得。
在 MIT (麻省理工,the Massachusetts
Institute of Technology),
有人想在一臺執行 Unix 的
PDP-11 計算機上驅動 Wang
(王安公司?) 的
Graphic Systems CAT
排字機,一種圖形化的輸出裝置。
由於 runoff
在這種任務上能力有限,它被
Josef F. Osanna, (Multics
作業系統的主要開發者之一,幾個
runoff 移植系統的作者)
繼續開發,成為一種更強大的文字排版系統
runoff 這個名字被簡化為
roff. Ocsanna
所設想的,極大擴充套件了的語言已經包含了一個完整的
roff 系統的所有元素。
所有現代的 roff
系統都試圖實現同這個系統相容。
因此 Joe Osanna
是當之無愧的所有 roff
系統之父
最早的
roff
系統有三個排版程式
- troff
- (typesetter roff)
為它唯一支援的 CAT
排字機產生一個圖形的輸出
- nroff
- 為終端和文字印表機產生合適的文字輸出
- roff
- 對最初的 runoff
程式的有限功能進行重新實現;
這個程式在後來的版本中被拋棄。
現在, roff
這個名字只用來指代一個
troff/nroff 系統的整體
Osanna 的第一版用 PDP-11
的組合語言實現,釋出於
1973.
Brian Kernighan 加入到
roff
的開發中,使用
C 程式語言將它進行了重寫。
C 版本釋出於 1975.
nroff/
troff
程式使用的排版語言的語法記載在著名的
Troff User's Manual [CSTR #54]
中,出版於 1976, Brian Kernighan
對它不斷修訂,直到 1992
年。
此文件是對傳統的
classical
troff 的說明. 所有後來的
roff
系統都試著與這個說明實現相容
1977 年,Osanna 在他 50
歲時,由於一次突發的心臟病而去世。
Kernighan 繼續開發 troff。
下一個開發目標是賦予
troff
一個更一般的介面,以支援更多裝置,
中間輸出格式和
“後處理” 系統。
這使得
roff
系統的結構趨於完整,現在仍然被使用。參見
USING ROFF 段。 1979
年,它們被寫入論文
[CSTR #97]. 這個新的 troff
版本是所有現存的較新的
troff 系統的基礎,包括
groff.
在一些系統上,這個裝置無關的
troff
有一個可執行檔案叫做
ditroff(7). 所有現代的
troff
程式都已經自動提供了對
distroff 完整的相容性
免費的 Unix 7
作業系統商業化之後,出現了嚴重的退步。
一大批不同的作業系統浮出水面,為他們所作的擴充套件間的互不相容而爭鬥。
幸好,這種不相容沒有影響到原始的
troff。
所有不同的商業版本的
roff 系統都大量使用了
Osanna/Kernighan
的開放的原始碼和文件,但是卻將其作為
它們的 系統 (“their”
system) 出售—
只有很少的修改
古老的 Unix 和傳統的 troff
的原始碼在長達 20
年時間裡不再可以自由獲得。
幸運的是,Caldera 收購了 SCO
UNIX (2001). 隨後,Caldera
使得原始碼可以在網上獲得,允許用於非商業用途。參見
SEE ALSO 段
(譯註:誰能想到,現在,2003
年,SCO會成為自由軟體和開源軟體界共同的敵人呢?
而Caldera
又在什麼地方呢?)
任何商業的 roff
系統都無法成為 roff
開發中的後繼者。
商業社會中的每個人都只對他們自己的事情感興趣。
這使得曾經如此優秀的
Unix 作業系統在 80
年代一蹶不振
作為對如此快速的商業化過程的補救
(As a counter-measure to the galopping
commercialization,還請重新翻譯),
AT&T Bell Labs
貝爾實驗室試圖發起一個恢復性的專案
(?,a rescue project)
,使用他們的
Plan 9
作業系統。
它可以免費用於非商業用途,甚至包含了原始碼。
但是它有一個專利許可證,that
empedes the free development (
還請解釋詞義)。
這種想法早已過時,因此
Plan 9
沒有被主流開發者接受為自己的平臺
真正的補救措施 (?,
remedy)
是不斷出現的自由作業系統
(386BSD, GNU/Linux, 等等.) 和 80 年代到 90
年代的自由軟體工程。
他們實現了傳統的 Unix
的特性和很多擴充套件,因此舊的
“XP體驗” 不會丟掉 (such that
the old experience is not lost)。 進入 21
世紀,類 Unix
系統重新成為計算機工業中的主導因素
— 這要感謝自由軟體
最重要的自由 roff 計劃是
GNU 移植版本的 troff, 由 James
Clark 建立,使用 它叫做
groff (
GNU roff). 參見
groff(1)
中的概述
groff
系統仍然在繼續開發。
它與傳統 troff
相容,但是還添加了很多擴充套件。
它是第一個可以在幾乎所有作業系統上執行的
roff 系統並且 —
它是自由開放的。
這使得 groff 成為現在 roff
的事實標準
很多人不會注意到他們在使用
roff。
當你閱讀一份手冊頁 (man
page) 時,roff 工作在後臺。
roff 文件可以使用
xditview(1x)
程式檢視,它是一個 X
發行版的標準程式。參見
X(7x). 但是顯式地使用 roff
也不困難
一些 roff
實現提供了包裝程式,使得人們可以簡單地在命令列使用
roff 系統。 例如,GNU 的 roff
實現
groff(1)
提供了命令列選項來避免傳統
troff
中過長的的命令管道;
grog(1)
程式試著從文件猜測應當使用什麼引數來執行
groff;
不習慣於指定命令列選項的人應當用
groffer(1)
程式來圖形化地顯示 groff
檔案和手冊頁
roff 系統由預處理器
(preprocessor),roff
排版程式和後處理器
(postprocessor) 組成。
這種結構使用了大量的管道
piping
機制,意思是,一系列的程式陸續地被呼叫,
佇列中的每個程式的輸出就作為下一個程式的輸入
\
預處理器產生 roff
程式碼,傳給一個 roff
處理器 (例如,troff),
然後 roff
處理器接下來產生中間輸出,傳給一個後處理器程式,
用來列印或者產生最終輸出
所有這些元件都使用它們自己的程式語言;
每種語言是與其他元件完全無關的。
此外,還可以包括為特殊目標而製作
(tailor) 的 roff 宏包
大多數 roff
文件中摻雜著使用一些包中的宏、
一個或多個預處理器的程式碼,還會新增
roff 語言中的一些元素。
使用者很少需要用到 roff
排版語言的完整功能;
只有宏包的作者需要知道底層細節
(gory details)
預處理器是任何產生符合
roff
排版語言語法的輸出的程式。
每個預處理器都有它自己的語言,在預處理器執行時被翻譯為
roff 程式碼。 roff
文件中可以包含以這種語言寫成的片段;
它們可以被特殊的 roff
命令或宏識別 (they are identified by
special roff requests or macros)。
加入了預處理器程式碼的文件必須透過所有相應的預處理器處理之後,
才能傳給真正的 roff
排版程式,
因為真正的 roff
排版程式會忽略所有陌生的程式碼。
預處理器只會分析並轉換指定由它處理的文件部分
有大量的自由/商業 roff
預處理器。
一些不能在所有系統上使用,
還有一些預處理器被認為是
roff
系統不可分割的部分。
傳統的預處理器有
- tbl
- 製表 (table)
- eqn
- 數學公式 (mathematical
formulæ)
- pic
- 繪圖 (diagram)
- refer
- 書目索引 (bibliographic
references)
- soelim
- 包含標準位置的宏檔案
(macro)
其他已知預處理器,但不是在所有系統上都可用,包括
- chem
- 化學公式 (chemical
formulæ)
- grap
- 構造圖元 (graphical elements)
- grn
- 插入 gremlin(1) 圖片
A
roff formatter
排版程式是一個解釋用
roff 排版語言或 roff
宏包寫成的文件的程式。
它產生中間結果
intermediate
output,
將送入單一裝置後處理器。後處理器必須在排版程式的命令列選項中指定。
文件必須已經通過了所有需要的預處理器處理
roff
排版程式的輸出以另外一種語言表示:
intermediate output format 或
troff output.
這種語言最初詳述在
[CSTR #97] 中;它的 GNU
擴充套件記載在
groff_out(5)
中。
中間輸出語言與高階的
roff
語言相比像一種彙編指令語言。
產生的中間輸出是為一種特定的裝置最佳化過的,
但是對於所有裝置,這種語言都適用
roff 排版程式是整個 roff
系統的核心。 傳統 roff
有兩個排版程式:
對應字元裝置的
nroff
和對應圖形裝置的
troff
通常,
troff
這個名字泛指這兩種排版程式
(is used as a general term to refer to both formatters)。
裝置是類似印表機、字元或圖形終端等的硬體介面,
或者是用於轉換為另一種字元或圖形裝置的軟體介面
後處理器是將 troff
輸出轉化為一種適於某種特殊裝置的格式的程式。
對於輸出目標來說,roff
後處理器像是它們的裝置驅動
每種裝置都有為其最佳化的後處理器程式。.
後處理器解釋中間輸出,產生裝置相關的程式碼,傳送給裝置
裝置名和後處理器程式的名稱是不固定的,
因為它們依賴於計算機的軟硬體的能力。
例如,
[CSTR #54]
中提到的傳統的裝置名已經有了極大的改變。
舊的硬體不再存在,舊的圖形轉換程式與現代同等功能的程式相比太不精確了
例如,Postscript 裝置
post
在傳統 troff 中解析度是
720,而 groff 的
ps 裝置是 72000,
提高了 100 倍
現在,作業系統為大多數類似印表機的硬體提供了裝置驅動,
因此不必為每個印表機寫一個特殊的後處理器
roff 文件是加入了 roff
排版元素的普通文件。
roff 排版語言非常強大;
它幾乎是一個完整的程式語言,並且提供了擴充自身的元素。
使用這些元素,就可以開發為特殊程式定製的宏包。
這樣的宏包比普通的 roff
要容易上手得多。
所以大多數人會選擇一中宏包,
不用去關心 roff
語言的內部實現
宏包是一些適於以便利的辦法格式化某種特殊文件的宏的集合。
它們簡化了 roff 的使用。
一個包的宏定義儲存在一個叫做
name.tmac 的檔案中
(傳統的命名是
tmac.name).
所有 tmac
檔案儲存在標準位置的一個或多個目錄中。
有關宏包的命名和位置的細節可以看
groff_tmac(5).
文件中用到的宏包可以使用命令列選項
提供給排版程式, 參見
troff(1),
它們也可以在文件中指定,使用
roff 語言的 “包含檔案”
命令,參見
groff(7).
著名的傳統宏包有
man
用來處理傳統手冊頁
mdoc 處理 BSD
樣式的手冊頁;此類書籍、文件和信件的宏集合是
me
(命名也許是根據它的創造者之名
Eric Allman 而來),
ms
(命名來自
Manuscript Macros), 還有
mm (命名來自
Memorandum Macros).
傳統的 roff
排版語言記述在 troff
使用者手冊
Troff User's Manual
[CSTR #54] 中. roff
語言是完整的程式語言,提供了命令
(request),宏定義,轉義序列
(escape sequence),
字串變數,數字或數量暫存器
(number or size
registers),還有流程控制語句
Requests “命令”
是預定義的基礎的排版命令,與
shell 提示下的命令類似。
使用者可以定義類似
“命令”
的元素,使用 roff 的
“預定義” 元素。
使用者定義的命令就被叫做
“宏”
macros.
文件作者不會體會到
命令和宏
之間用法的任何區別;
它們都寫在一行中,並以一個點
(dot, `.') 開始
Escape sequences “轉義序列”
是以反斜槓 (backslash, )
開始的 roff 元素。
它們可以被插入到任何地方,包括文字的一行中間。
它們用來實現不同的功能,可以使用
插入非 ASCII 字元,使用
改變字型,使用
插入行內註釋,它們也可以轉義特殊的控制字元,像這樣
還有很多很多其他的功能
Strings “字串”
是儲存一個字串的變數。
字串以
.ds 命令儲存。
儲存的字串可以用
\*
轉義序列獲得
Registers “暫存器”
儲存數字和數量。
暫存器可以用
.nr
命令設定,然後用控制序列
\n 來獲得它的值
手冊頁使用章節號作為副檔名,例如本文件的檔名是
roff.7,
也就是說它放在手冊頁的第
7 章
傳統的宏包使用包名稱作為副檔名,例如
file.me 意思是使用了
me 宏包的檔案,
file.mm 使用了宏包
mm,
file.ms 用的是
ms,
file.pic 則是
pic 等等
但是沒有 roff
文件統一的命名方式,儘管
file.tr 用於
troff file
在現在和當時都是一樣的
也許應當有 roff
副檔名的一個標準
副檔名與
less(1)
格式化工具結合,會非常好用。
它提供了用單一的方式開啟各種輸入的可能性,
方法是定義一個 shell
環境變數
LESSOPEN.
這種辦法沒有什麼文件,這是一個例子:
\
\
lesspipe
可以是一個系統提供的命令或者是你自己的指令碼。
最好的 roff 文件編輯器是
Emacs,參見
emacs(1).
它提供了
nroff
模式,適於所有種類的
roff “方言”。
可以用下面的命令來啟用這種模式
當用 Emacs
編輯文件時可以輸入
`
M-x nroff-mode'
來改變模式,這裡
M-x
意思是按住
Meta 鍵 (或
Alt) 同時點一下
x 鍵
也可以在編輯器載入檔案的時候,自動改變模式
- 最好的辦法是將下面三行註釋包含在檔案末尾
-
\
.\" Local Variables:
.\" mode: nroff
.\" End:
- 有一系列的副檔名,例如手冊頁的副檔名,會自動觸發
nroff 模式
- 理論上,可以將下面的序列
-
\
.\" -*- nroff -*-
\
作為檔案的第一行,也可以使
emacs 在載入檔案時啟用
nroff 模式。
不幸的是,一些程式例如
man
在這種方法中會出錯;因此請不要用它
所有的 roff
排版程式都提供了自動的斷行以及水平和豎直間距。
為了不干擾它的功能,應當注意以下幾點:
- 不要在 roff
文件中包含空行或只包含空格的行,
- 而是使用“空行”命令
(一行中只包含一個點),或者一行註釋
.\"
(如果需要一個構造元素的話)
- 不要在行首用空格,因為這會導致不可預測的行為。
- 段落縮排可以以受控的方式,用
roff 命令構造出來
- 每句話應當放到自己的一行中,因為句號後面的空格的處理方法是根據它結束的是短語還是句子而不同的。
- 要區別這兩種情況,在每句話後面加上一個換行
- 另外要使用 Emacs 的
auto-fill
模式的話,最好在每句話後面新增一個空的
roff 命令
(一行中只包含一個點)
下面的例子顯示了最佳的
roff 編輯習慣是怎樣的
-
這是一個 roff 文件的例子.
這是同一段中的下一句.
這是下一個句子,它比較長,分成了多
行;類似 `cf.' 這樣的短語可以很容易地
識別,因為其中的“點”後面沒有換行.
(在輸出時,它們仍會在同一段中.)
(譯註:如果使用中文的標點“。”就不用考慮這些,
但是每句話後面換行總是個好主意。少用 `.' 為妙)
除了
Emacs,其他一些編輯器也提供了
nroff
格式檔案的支援,例如
vim(1), 它是
vi(1)
程式的擴充套件
UNIX® 是 Open Group
的註冊商標。 但是在
Caldera 在 2001 年收購 SCO UNIX
之後,事情發生了極大的好轉
(譯註:為什麼 2003 年 SCO
又會成為 M$ 的走狗呢?)
有大量的講述 roff
的文件。 講述傳統 troff
的原始文件仍可獲得,groff
的所有方面也都詳細地記錄在文件中
- troff.org
- 提供了 roff
所有歷史方面的概述和指引。
這個網站仍在建設;但是,它將成為
roff 歷史的主要來源
- Multics
- 包含很多 MIT
的專案的資訊,CTSS,Multics,早期的
Unix,還包括 runoff;
尤其有用的是一個術語字典,還有很多到古老的文件的連結
- Unix Archive
- 提供了古老的 Unix
的原始碼和一些二進位制檔案
(包括 troff
的原始碼和它的文件),它們
是 Caldera 自 2001
年以來公開的,例如著名的
Unix 版本 7 的 PDP-11
平臺版本位置是
- Developers at AT&T Bell Labs
- 提供了搜尋早期開發者資訊的功能
- Plan 9
- AT&T Bell Labs
貝爾實驗室的作品
- runoff
- 儲存了古老的 runoff
排版語言寫成的一些文件
- CSTR Papers
- 儲存了原始的 troff
手冊 (CSTR #54, #97, #114, #116, #122)
還有著名的有關程式設計的歷史文件
- GNU roff
- 提供了 自由的 roff
實現:groff,並且它是 roff
的事實標準
很多
歷史文件仍然可以線上獲得。
troff
語言主要的兩部手冊是
- [CSTR #54]
- J. F. Osanna,
(《使用者手冊》) Bell Labs,
1976; revised by Brian Kernighan, 1992.
- [CSTR #97]
- Brian Kernighan,
(《裝置無關的 troff》) Bell
Labs, 1981, revised March 1982.
將 roff
作為一種“小語言”("little
language") 來講述的論文有
- [CSTR #114]
- Jon L. Bentley and Brian W. Kernighan, (《grap:
一種圖形排版語言》)
Bell Labs, August 1984.
- [CSTR #116]
- Brian W. Kernighan, (《pic:
一種排版用的圖形控制語言》)
Bell Labs, December 1984.
- [CSTR #122]
- J. L. Bentley, L. W. Jelinski, and B. W. Kernighan,
(《chem:
排版化學結構圖的程式,計算機與化學》)
Bell Labs, April 1986.
由於它結構複雜,完整的
roff
系統包含很多很多手冊頁,
每一個都描述了 roff
的一個方面。
不幸的是,不同的 roff
實現之間,它們的手冊沒有相同的命名格式
在
groff 中,手冊頁
groff(1)
包含了 groff
相關的所有文件的索引
其他系統中,你需要自己探索,但是
troff(1) 是個很好的起點
Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
This document is distributed under the terms of the FDL (GNU Free Documentation
License) version 1.1 or later. You should have received a copy of the FDL on
your system, it is also available on-line at the
此文件是
groff, GNU roff
套件的一部分。
它的作者是
它的管理者是
bbbush <[email protected]>
2003.11.28
http://cmpp.linuxforum.net
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh