A troff, a „typesetter roff” rövidítése, a Bell Labs által a Unix operációs rendszerhez kifejlesztett dokumentumfeldolgozó rendszer fő komponense. A troff és a hozzá kapcsolódó nroff is az eredeti roffból lett kifejlesztve.

Míg az nroff terminálokon és sornyomtatókon történő kimenet előállítására készült, addig a troff a szedőrendszereken, különösen az 1972-ben bevezetett Graphic Systems CAT-on történő kimenet előállítására. Mindkettő ugyanazt a mögöttes jelölőnyelvet használta, és egyetlen forrásfájlt általában változtatás nélkül használhatott az nroff és a troff is.

A troff parancsokat tartalmaz a betűtípusok, a szóközök, a bekezdések, a margók, a lábjegyzetek és egyéb elemek kijelölésére. Sok más szövegformázótól eltérően a troff képes a karaktereket tetszőlegesen elhelyezni az oldalon, akár átfedéssel is, és teljesen programozható beviteli nyelvvel rendelkezik. Külön előfeldolgozókat használunk a táblázatok, diagramok és matematika jelek kényelmesebb előállításához. A troff bemenetei egyszerű szövegfájlok, és bármilyen szövegszerkesztővel létrehozhatók.

A különböző dokumentumstílusokhoz kiterjedt makrócsomagok készültek. Egy tipikus troff disztribúció tartalmazza a me makrókat a kutatómunkák formázásához, a man és mdoc makrókat a Unix man oldalak létrehozásához, az mv makrókat a beépíthető projektor-fóliák létrehozásához, valamint az ms és mm makrókat a levelekhez, könyvekhez, technikai memorandumokhoz és jelentésekhez.

Történet A troff eredete a RUNOFF nevű szövegformázó programra vezethető vissza, amelyet Jerome H. Saltzer írt az MIT CTSS operációs rendszeréhez az 1960-as évek közepén. (A név állítólag az I'll run off a document kifejezésből származik).

Bob Morris átültette a GE 635 architektúrára, és a programot roff-nak (a runoff rövidítése) nevezte el. Majd rf néven átírták a PDP-7-re, és ugyanebben az időben (1969) Doug McIlroy átírta a roff kiterjesztett és egyszerűsített változatát a BCPL programozási nyelven.

A Unix első verzióját egy PDP-7-en fejlesztették ki, a Bell Labs környezetében. 1971-ben a fejlesztők egy PDP–11-et akartak beszerezni az operációs rendszer további fejlesztéséhez. Hogy igazolják a rendszer költségeit, azt javasolták, hogy a Bell Labs szabadalmi osztálya számára egy dokumentumformázó rendszert valósítanának meg. Ez az első formázó program a McIllroy-féle roff újraimplementációja volt, amelyet Joe F. Ossanna írt.Joseph Frank Ossanna, Jr. (1928. december 10. – 1977. november 28.) amerikai villamosmérnök és számítógép-programozó, aki a New Jersey állambeli Murray Hillben található Bell Telephone Laboratories műszaki személyzetének tagjaként dolgozott.

Amikor rugalmasabb nyelvre volt szükségük, megírták a roff új változatát, az nroff-ot (newer „roff”), amely az összes későbbi verzió alapját képezte. Amikor beszereztek egy Graphic Systems CAT fénymásolót, Ossanna módosította az nroff-ot, hogy több betűtípust és az arányos szóközöket támogassa. A troff-nak, a betűszedő roff-nak nevezett, kifinomult kimenete lenyűgözte a szedőgyártókat, és megzavarta a lektorokat, akik azt hitték, hogy már korábban megjelentek troff-ot használó kéziratok.J. F. Ossanna. Nroff/Troff User's Manual. CSTR #54, Bell Labs, 1976. Revised by B. W. Kernighan, 1992.

A troff-fal együtt jött az nroff (valójában majdnem ugyanaz a program volt), amely a sornyomtatók és karakteres terminálok kimenetének előállítására szolgált. Mindent megértett, amit a troff csinált, és figyelmen kívül hagyta azokat a parancsokat, amelyek nem voltak alkalmazhatóak, pl. a betűtípusok megváltoztatását.

Az Ossanna-féle troff-ot PDP–11 assembly nyelven írták, és kifejezetten a CAT fénymásolóhoz készített kimenetet. Újraírta C-ben, bár most már 7000 sor kommentálatlan kódot tartalmazott, és továbbra is a CAT-tól függött. Mivel a CAT egyre kevésbé volt elterjedt, és a gyártó már nem támogatta, prioritássá vált, hogy más eszközöket is támogasson. Ossanna meghalt, mielőtt ez a feladat befejeződött volna, így Brian Kernighan vette át a troff újraírásának feladatát. Az újonnan átírt változat olyan eszközfüggetlen kódot eredményezett, amelyet a posztprocesszorok nagyon könnyen tudtak olvasni és lefordítani a megfelelő nyomtatókódokra. A troff ezen új verziója (gyakran ditroff-nak nevezték, device independent troff) számos bővítéssel rendelkezett, amelyek rajzoló funkciókat is tartalmaztak.B. W. Kernighan. A Typesetter-Independent TROFF. CSTR #97, Bell Labs, 1981, revised March 1982. A program dokumentációja meghatározza a ditroff kimeneti formátumát, amelyet számos modern troff klón, például a GNU groff használ.

1983-ban a troff egyike volt a Charles River Data Systems UNOS operációs rendszeréhez Bell Laboratories licenc alatt elérhető UNIX eszközöknek.

A troff eszközgyűjteményt (beleértve az elő- és utófeldolgozókat is) végül Documenter's WorkBench (DWB) néven emlegették, és 1994-ig folyamatosan fejlesztették a Bell Labs-ben, majd a később kivált Unix System Laboratories-ban (USL). Ekkor a SoftQuad vette át a karbantartást, bár Brian Kernighan egyedül folytatta a troff fejlesztését. Így az eredeti Bell Labs troff-nak legalább a következő változatai vannak használatban: a SoftQuad DWB, amely az 1994-es USL DWB 2.0-n alapul; a Lucent Software Solutions (korábban USL) DWB 3.4 verziója; troff, Plan 9 kiadás.

Bár a troff-ot már kiszorították más programok, például az Interleaf, a FrameMaker és a LaTeX, még mindig széles körben használják. Továbbra is ez az alapértelmezett formázó a UNIX dokumentációhoz.

A szoftvert 1990-től kezdődően groff néven újra implementálták a GNU rendszerre. Ezen kívül a korai UNIX rendszerek nyílt forráskódjának, valamint a modern utódoknak köszönhetően, mint például az OpenSolaris-on és a Plan 9-en található ditroff-alapú nyílt forráskódú változatok, az AT&T troff több változata (CAT és ditroff-alapúSee the man page of the ditroff -> postscript converter on OpenSolaris: dpost(1) – illumos and OpenSolaris User Commands Reference Manual from latest Sun based OpenSolaris) is elérhető különböző nyílt forráskódú licencek alatt.

Makrók Általában nem javasolták a troff közvetlen használatát, hanem inkább valamilyen könnyebben használható felületen keresztül. A troff olyan makrókat tartalmaz, amelyek a dokumentum feldolgozásának megkezdése előtt futnak le. Ezek a makrók magukban foglalják az oldalfejlécek és láblécek beállítását, új parancsok definiálását és a kimenet formázásának befolyásolását. A makrókészlet beillesztésének parancssori argumentuma a -mname, ami ahhoz vezetett, hogy sok makrókészletet alapfájlnévként ismernek, egy vezető m-mel az elején.

A szabványos makrókészletek, m-mel kezdődően a következők: man kézikönyv oldalak létrehozásáhozman(7) – Linux Miscellanea Manual mdoc a szemantikailag kommentált kézikönyvoldalakhoz, amelyek jobban alkalmazkodnak a mandoc más formátumba való konvertálásáhozmdoc(7)– FreeBSD Miscellaneous Information Manual mandoc egy olyan fúzió, amely mindkét manual parancskészletet támogatja me kutatási dokumentumok készítéséhezgroff_me(7) – Linux Miscellanea Manual mm memorandumok létrehozásáhozgroff_mm(7) – Linux Miscellanea Manual ms könyvek, jelentések és műszaki dokumentációk készítéséhezgroff_ms(7) – Linux Miscellanea Manual

Az ms makrók voltak az első ilyenek, amelyeket az AT&T-nél fejlesztettek ki, mielőtt az mm makrók kiszorították volna őket. Az mm makrók egyik célja az volt, hogy a Bell Labs gépírói számára is használhatóak legyenek, ami idővel meg is történt, és az mm makrók a Bell Labs szabványává váltak. Az AT&T az mm makrókat kereskedelmi forgalomba hozta a System V Unixhoz. Ezzel szemben a me makrókat a Berkeley-n fejlesztették ki.

Egy példa egy egyszerű üzleti levélre, amelyet az mm makrókkal készíthetünk el: .TL .ND "January 10, 1993" .AU "Ms. Jane Smith" .AT "Upcoming appointment" .MT 5 Reference #A12345 .sp 4 Mr. Samuel Jones .sp 0 Field director, Bureau of Inspections .sp 0 1010 Government Plaza .sp 0 Capitoltown, ST .sp 3 Dear Mr. Jones, .sp 2 .P Making reference to the noted obligation to submit for state inspection our newly created production process, we request that you consider the possible inappropriateness of subjecting the innovative technologies of tomorrow to the largely antiquated requirements of yesterday. If our great state is to prosper in the twenty-first century, we must take steps .B now , in .I this year of .I this decade, to prepare our industrial base for the interstate and international competition that is sure to appear. Our new process does precisely that. Please do not let it be undone by a regulatory environment that is no longer apt. .P Thank you for your consideration of our position. .FC Sincerely .SG

A rendelkezésre álló makrók átfogó listája általában a tmac(5) kézikönyvben található.groff_tmac(5)– Linux File Formats Manual

Preprocesszorok A troff fejlődése során, mivel számos olyan dolog van, amit nem lehet egyszerűen elvégezni a troff-ban, számos preprocesszort fejlesztettek ki. Ezek a programok a dokumentum bizonyos részeit átalakítják troff bemenetre, természetesen illeszkedve a Unixban használt „pipelines” használatához — az egyik program kimenetét egy másik program bemeneteként küldik el (lásd pipes és filters). Jellemzően minden előfeldolgozó a bemeneti fájlnak csak a speciálisan megjelölt részeit fordítja le, a fájl többi részét változatlanul átadja. A beágyazott előfeldolgozási utasításokat egy egyszerű, alkalmazásspecifikus programozási nyelven írják, ami nagyfokú teljesítményt és rugalmasságot biztosít.

Az eqn preprocesszor lehetővé teszi a matematikai képletek egyszerű és intuitív módon történő megadását.B. W. Kernighan and Lorinda L. Cherry. A System for Typesetting Mathematics. CSTR #17, Bell Labs, May 1974. A tbl egy preprocesszor a táblázatok formázásához. refer (és a hasonló bib program) a dokumentumban található idézeteket egy bibliográfiai adatbázis alapján dolgozza fel.

Három preprocesszor biztosítja a troff számára a rajzolási képességeket a kép leírására szolgáló tartományspecifikus nyelv meghatározásával. A pic egy procedurális programozási nyelv, amely különböző rajzolási funkciókat biztosít, mint például a circle és a box.B. W. Kernighan. PIC — A Graphics Language for Typesetting (Revised User Manual). CSTR #116, Bell Labs, December 1984. Az ideal lehetővé teszi a képek deklaratív rajzolását, a képet a bemenet által leírt vektorokon és transzformációkon alapuló szimultán egyenletrendszer megoldásával származtatva.C. J. Van Wyk. IDEAL User's Manual. CSTR #103, Bell Labs, December 1981. grn a képeket abszolút koordinátákkal rajzolt grafikus elemekkel írja le, egy korai grafikus munkaállomás által meghatározott gremlin fájlformátum alapján.grn — groff preprocessor for gremlin files .

Ezen kívül van egy soelim parancs, amely eltávolítja a include direktívákat a bemeneti szövegből.

A csővezeték tipikus felépítése a következő lehet:

soelim file | refer | ideal | pic | tbl | eqn | troff

Még több preprocesszor teszi lehetővé bonyolultabb képek rajzolását azáltal, hogy kimenetet generál a pic számára. A grap grafikonokat rajzol, például szórásdiagramokat és hisztogramokat.J. L. Bentley and B. W. Kernighan. GRAP — A Language for Typesetting Graphs (Tutorial and User Manual). CSTR #114, Bell Labs, August 1984. chem kémiai szerkezeti diagramokat rajzol.J. L. Bentley, L. W. Jelinski, and B. W. Kernighan. CHEM — A Program for Typesetting Chemical Structure Diagrams. CSTR #122, Computers and Chemistry, Bell Labs, April 1986. A dformat rekord alapú adatszerkezeteket rajzol.J. L. Bentley. DFORMAT — A Program for Typesetting Data Formats. CSTR #142, Bell Labs, April 1988.

Egyéb front-endek Számos más front-endet is kifejlesztettek, amelyek célja, hogy barátságosabb interfészek legyenek a troffhoz.