侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux troff命令实用教程: 如何高效使用troff排版处理程序(附案例详解和注意事项)

Linux troff命令介绍

troff命令是一个用来格式化文本的命令,它是Unix文档处理系统的主要组成部分。troff命令可以将文本转换为适合打印机和字符终端的输出,它支持多种字体、样式、大小、对齐、缩进、表格、公式等功能。troff命令的输出需要经过一个后处理器来转换为目标设备的格式,例如psroff可以将troff的输出转换为PostScript格式,groff可以将troff的输出转换为多种格式,包括HTML、PDF、ASCII等。troff命令的历史可以追溯到1960年代,它是由MIT的Jerome Saltzer开发的RUNOFF程序的后代,RUNOFF程序是最早的文本格式化程序之一,它的名字来源于“to run off a document”的意思,即准备一个文档以供出版或展示。troff命令的名字是“typesetter roff”的缩写,表示它是用于排版设备的roff程序,roff程序是RUNOFF程序的改进版本,它在Unix系统上得到了广泛的使用和发展。troff命令的一个重要的贡献者是Brian Kernighan,他重写了troff命令,使其具有更灵活的语法和设备无关的特性。troff命令在Unix系统中仍然有很大的影响力,它是man命令的默认类型格式化程序。

Linux troff命令适用的Linux版本

troff命令可以在多种Linux版本中使用,但是不同的Linux版本可能使用不同的后处理器来处理troff命令的输出,因此可能需要安装相应的软件包来支持troff命令。例如,在CentOS 7中,可以使用yum命令来安装groff软件包,它包含了troff命令和多种后处理器,如下所示:

[linux@bashcommandnotfound.cn ~]$ sudo yum install groff

在CentOS 8中,可以使用dnf命令来安装groff软件包,如下所示:

[linux@bashcommandnotfound.cn ~]$ sudo dnf install groff

在Ubuntu中,可以使用apt命令来安装groff软件包,如下所示:

[linux@bashcommandnotfound.cn ~]$ sudo apt install groff

Linux troff命令的基本语法

troff命令的基本语法如下:

troff [options] [files]

其中,options是一些可选的参数,用来控制troff命令的行为,例如指定输出设备、字体目录、页面编号、错误信息等。files是一个或多个要格式化的文本文件,如果没有指定文件或者指定了-符号,那么troff命令会从标准输入读取文本。troff命令的文本文件由两种类型的行组成:控制行和文本行。控制行以.或'开头,用来指定一些格式化的请求,例如改变字体、大小、对齐、缩进等。文本行是普通的文本,用来显示在输出中,文本行可以包含一些转义序列,用来指定一些特殊的字符、符号、字体、样式等。troff命令会根据控制行和文本行的内容来生成输出,输出会发送到标准输出或者指定的后处理器。

Linux troff命令的常用选项或参数说明

troff命令有很多可选的参数,用来控制troff命令的行为,下表列出了一些常用的参数及其说明:

参数说明
-a生成ASCII近似的输出,用于字符终端或者不支持troff格式的打印机
-b在每个警告或错误信息后面打印一个回溯,用于调试troff命令的输入
-c禁用彩色输出(在兼容模式下总是禁用)
-C启用兼容模式,用于处理旧版本的troff命令的输入
-dcs定义一个字符串变量c或name为s,c必须是一个单字母的变量名
-E禁止所有troff命令的错误信息,注意这不会影响宏包使用的tm或tm1请求输出到标准错误的信息
-ffam使用fam作为默认的字体族,例如R表示罗马字体,I表示意大利字体,B表示粗体,BI表示粗斜体
-Fdir在dir目录或目录路径中搜索设备相关的文件,例如devname目录(name是设备的名字),DESC文件和字体文件,dir会在其他字体目录之前被搜索
-i在所有指定的文件处理完后,从标准输入读取文本
-Idir添加一个目录到文件的搜索路径中,包括命令行上的文件和.psbb请求中的文件,搜索路径的初始值是当前目录,这个参数可以多次指定,目录会按照指定的顺序被搜索(但是在当前目录之前),如果要让当前目录在其他目录之前被搜索,可以在适当的位置添加-I.参数
-mname读取一个宏包文件name,宏包文件是一些包含常用格式化请求的文件,例如man是用于手册页的宏包,ms是用于技术报告的宏包,me是用于电子邮件的宏包,mm是用于函件的宏包,等等
-Mdir在dir目录或目录路径中搜索宏包文件,dir会在其他宏包目录之前被搜索
-nnum用num作为第一个打印页的页码,num必须是一个整数
-olist只打印olist中指定的页,olist是一个由逗号分隔的页码和范围的列表,例如1,3,5-7表示打印第1,3,5,6,7页
-rcn定义一个数字变量c或name为n,c必须是一个单字母的变量名,n必须是一个整数
-Tname指定输出设备的名字,例如ps表示PostScript,ascii表示ASCII,等等,这会影响troff命令使用的字体和后处理器
-wname启用一个警告类型name,例如w表示启用所有警告,c表示启用兼容性警告,等等
-Wname禁用一个警告类型name,例如Ww表示禁用所有警告,Wc表示禁用兼容性警告,等等
-z禁止输出,只打印错误信息

Linux troff命令的实例

下面给出一些troff命令的实例,展示了troff命令的一些常用功能和用法。

实例1:使用troff命令格式化文本

假设我们有一个文本文件hello.txt,内容如下:

.Hello, world!
This is a simple example of using troff command.

其中,.H是一个控制行,用来指定一个标题,Hello, world!是标题的内容。第二行是一个文本行,用来显示普通的文本。我们可以使用troff命令来格式化这个文本文件,例如:

[linux@bashcommandnotfound.cn ~]$ troff hello.txt | groff -Tascii

这个命令会将hello.txt文件的内容转换为ASCII格式的输出,并使用groff命令的-Tascii参数来指定后处理器为ASCII。输出的结果如下:

Hello, world!
This is a simple example of using troff command.

我们可以看到,输出的结果和输入的文本文件的内容基本一致,只是标题的字体变成了粗体,这是因为troff命令默认使用的字体族是R,即罗马字体,而标题的字体是B,即粗体。我们可以使用-f参数来改变默认的字体族,例如:

[linux@bashcommandnotfound.cn ~]$ troff -fI hello.txt | groff -Tascii

这个命令会将默认的字体族改为I,即意大利字体,输出的结果如下:

Hello, world!
_This is a simple example of using troff command._

我们可以看到,输出的结果中,文本的字体变成了斜体,这是因为意大利字体的特征。我们还可以使用其他的字体族,例如BI表示粗斜体,等等。

实例2:使用troff命令和宏包格式化手册页

假设我们有一个文本文件man.txt,内容如下:

.TH TROFF 1 "December 25, 2023"
.SH NAME
troff \- format documents
.SH SYNOPSIS
.B troff
[\fIoptions\fR] [\fIfiles\fR]
.SH DESCRIPTION
The
.B troff
command is used to format documents for printing or displaying on various devices. It supports multiple fonts, styles, sizes, alignments, indents, tables, equations, and other features. The
.B troff
command converts the input text into an intermediate format, which is then processed by a postprocessor to generate the output for the target device.
.SH OPTIONS
The
.B troff
command accepts the following options:
.TP
.B \-a
Generate ASCII approximation of the output, for character terminals or printers that do not support the
.B troff
format.
.TP
.B \-b
Print a backtrace after each warning or error message, for debugging the
.B troff
input.
.TP
.B \-c
Disable color output (always disabled in compatibility mode).
...

这是一个使用troff命令和man宏包来格式化手册页的文本文件,其中,.TH是一个控制行,用来指定手册页的标题,TROFF是手册页的名字,1是手册页的章节,December 25, 2023是手册页的日期。.SH是一个控制行,用来指定手册页的节标题,例如NAME,SYNOPSIS,DESCRIPTION,等等。.B是一个控制行,用来将文本显示为粗体,例如troff。.TP是一个控制行,用来指定一个带缩进的段落,用于显示选项和说明。.I是一个控制行,用来将文本显示为斜体,例如options,files。.fI和.fR是一些转义序列,用来改变字体,例如\fIoptions\fR表示将options显示为斜体。我们可以使用troff命令和man宏包来格式化这个文本文件,例如:

[linux@bashcommandnotfound.cn ~]$ troff -mman man.txt | groff -Tascii

这个命令会使用-mman参数来指定使用man宏包,然后使用groff命令的-Tascii参数来指定后处理器为ASCII。输出的结果如下:

TROFF(1)                      User Commands                     TROFF(1)

NAME
       troff - format documents

SYNOPSIS
       troff [options] [files]

DESCRIPTION
       The troff command is used to format documents for printing or
       displaying on various devices. It supports multiple fonts,
       styles, sizes, alignments, indents, tables, equations, and
       other features. The troff command converts the input text
       into an intermediate format, which is then processed by a
       postprocessor to generate the output for the target device.

OPTIONS
       The troff command accepts the following options:

       -a     Generate ASCII approximation of the output, for
              character terminals or printers that do not support
              the troff format.

       -b     Print a backtrace after each warning or error
              message, for debugging the troff input.

       -c     Disable color output (always disabled in
              compatibility mode).

       -C     Enable compatibility mode, for processing old
              versions of troff input.
...

可以看到,输出的结果是一个格式化的手册页,其中,每个节标题都是大写的,选项和说明都是用缩进的段落显示的,文本的字体和样式也根据控制行和转义序列进行了变化。我们还可以使用其他的宏包来格式化不同类型的文档,例如ms,me,mm,等等。

实例3:使用troff命令和转义序列格式化公式

假设我们有一个文本文件eqn.txt,内容如下:

.EQ
x = \f{-(b + \surd(b^2 - 4ac))}{2a}
.EN

这是一个使用troff命令和.eqn请求来格式化一个二次方程的文本文件,其中,.EQ和.EN是两个控制行,用来指定一个公式的开始和结束,\f是一个转义序列,用来指定一个分数,\surd是一个转义序列,用来指定一个根号,^是一个转义序列,用来指定一个上标。我们可以使用troff命令和.eqn请求来格式化这个文本文件,例如:

[linux@bashcommandnotfound.cn ~]$ troff eqn.txt | groff -Tascii

这个命令会使用groff命令的-Tascii参数来指定后处理器为ASCII。输出的结果如下:

     ___________
    -/ b^2 - 4ac
x = -------------
        2a

我们可以看到,输出的结果是一个格式化的二次方程,其中,分数、根号、上标都被正确地显示了。我们还可以使用其他的转义序列来指定其他的符号和样式,例如\l表示一个下划线,\v表示一个垂直线,*表示一个特殊字符,等等。

实例4:使用troff命令和表格请求格式化表格

假设我们有一个文本文件tbl.txt,内容如下:

.TS
tab(|);
l | l | l.
Name | Age | Occupation
_
Alice | 25 | Teacher
Bob | 30 | Engineer
Charlie | 35 | Doctor
.TE

这是一个使用troff命令和.tbl请求来格式化一个表格的文本文件,其中,.TS和.TE是两个控制行,用来指定一个表格的开始和结束,tab(|)是一个参数,用来指定表格的列分隔符为|,l | l | l.是一个参数,用来指定表格的列对齐方式为左对齐,_是一个控制行,用来指定表格的水平线。我们可以使用troff命令和.tbl请求来格式化这个文本文件,例如:

[linux@bashcommandnotfound.cn ~]$ troff tbl.txt | groff -Tascii

这个命令会使用groff命令的-Tascii参数来指定后处理器为ASCII。输出的结果如下:

Name    | Age | Occupation
--------------------------
Alice   | 25  | Teacher
Bob     | 30  | Engineer
Charlie | 35  | Doctor

我们可以看到,输出的结果是一个格式化的表格,其中,表格的列分隔符、列对齐方式、水平线都被正确地显示了。我们还可以使用其他的参数来指定表格的其他特性,例如c表示居中对齐,r表示右对齐,n表示数字对齐,等等。

实例5:使用troff命令和图片请求插入图片

假设我们有一个文本文件pic.txt,内容如下:

.PS
.PIC "linux-logo.png"
.PE

这是一个使用troff命令和.pic请求来插入一个图片的文本文件,其中,.PS和.PE是两个控制行,用来指定一个图片的开始和结束,.PIC是一个控制行,用来指定图片的文件名,linux-logo.png是一个图片文件,它是一个Linux的标志。我们可以使用troff命令和.pic请求来插入这个图片,例如:

[linux@bashcommandnotfound.cn ~]$ troff pic.txt | groff -Tps > pic.ps

这个命令会使用groff命令的-Tps参数来指定后处理器为PostScript,并将输出重定向到一个文件pic.ps中。我们可以使用一个PostScript查看器来查看这个文件,结果如下:

linux-logo.png

我们可以看到,输出的结果是一个包含Linux标志的图片,图片的大小和位置可以通过一些参数来调整,例如w表示图片的宽度,h表示图片的高度,c表示图片的居中,等等。我们还可以使用其他的图片格式,例如jpg,png,gif,等等。

Linux Troff命令的注意事项

如果你在使用troff命令时遇到bash: troff: command not found的错误,可能是因为你的系统中没有安装groff包。你可以按照上文提到的方式进行安装。

Linux Troff相关命令

nroff命令
nroff是一个类似于troff的命令,用于以文本格式处理和预览文档,而不是为打印机输出。
groff命令
groff是一个更为全面并且具备很多新特性的troff版本,它包含了一整套的宏,字体和驱动程序,可以为各种设备执行文本格式化和设备独立的排版。

0

评论区