UNIX文本处理:从打字机到宏格式的全面指南
1. 格式宏包概述
在技术写作领域,我们广泛使用扩展的ms宏包的部分内容,它与格式shell脚本结合,提供了一个完整的文档格式化环境。这个宏包最初由马萨诸塞计算机公司(MASSCOMP)的史蒂夫·塔尔博特开发,后来我们对其进行了扩展和通用化,以满足不同客户的文档设计需求。
该宏包依赖于底层的ms宏,严格来说它并非一个完整的包。不过,如果无法实现完整的ms宏,也可以定义一个简单的子集来满足基本需求。若想了解这些宏的完整实现信息,可通过出版商联系我们。
以下是格式宏包中用户可调用的宏的总结列表:
| 宏命令 | 功能 |
| — | — |
|
. [ABCDIh
| A级标题、B级标题等 |
|
. Dr
| 指定当前版本是否为草案(草案会标注日期) |
|
. Fs
| 开始一个图形 |
|
. Fe title
| 结束一个图形,图形会自动编号并添加指定标题 |
|
. H1 [ C ]
| 打印页面宽度的水平线,字符可指定(默认为下划线) |
|
. IOC [strings]
| 开始一份内部备忘录 |
|
. TO
| 后面跟随的名称列表将放入单独的分发列表 |
|
. TO name
| 指定收件人,最多五条此类行 |
|
. DA date
| 备忘录日期,会包含在页面页脚 |
|
. ND date
| 备忘录日期,会从页面页脚省略 |
|
. FR name
| 指定发件人,最多五条此类行 |
|
. CC name
| 指定接收备忘录副本的人,最多五条此类行 |
|
. SU subject
| 指定备忘录主题 |
|
. IP label indent [O]
| 开始带“悬挂缩进”的段落,后续文本缩进,标签留在页边距 |
|
. LP [O]
| 开始一个左对齐的段落,0可抑制空行 |
|
. Ls [type] [indent] [bullet]
| 开始一个(可能嵌套的)列表,type可选值有N(数字)、A(大写字母)、a(小写字母)、I(大写罗马数字)、i(小写罗马数字)、B(项目符号),默认缩进为5,bullet为可选项目符号字符串(空字符串也可接受) |
|
. Li [O]
| 列表项,0可抑制前导空行 |
|
. Le [O]
| 最内层列表结束,0可抑制前导空行 |
|
. Lt [1 2]
| 输入信件的地址块和日期(1)以及称呼(2) |
|
. Nd n
| 需要n行,如果页面剩余行数不足n,则换页,与
. ne
不同,
. Nd
会强制换行 |
|
. Nh [1 0]
| 启用/禁用编号标题(默认启用) |
|
. NS type
| 开始一个特定类型的注释,类型有N(注释)、C(警告)、W(警示)、R(审核注释)、P(私人注释),审核注释会打印在文本中并在末尾总结,私人注释仅出现在末尾列表中 |
|
. Ne
| 结束一个注释 |
|
. OB string
| 打印一个上划线(在字符串上方) |
|
. Ps [indent]
| 开始一个“打印输出”(显示),文本以CW字体打印且保持原样,不进行填充 |
|
. Pe
| 结束一个打印输出,参考
. Ps
|
|
. Rh [0 1] [desc] head...
| 创建参考页标题 |
|
. Se [number] [title]
| 开始一个章节,会设置许多默认值,适用于大多数文档 |
|
. SE
| 屏幕结束,结束以
. ss
开始的计算机屏幕插图 |
|
- SS [width] [height]
| 开始一个屏幕插图(圆角框),若未指定宽度和高度,则根据内容大小缩放 |
|
. Tc level
| 指定将保存在目录中的标题级别(Ah到Dh) |
|
. Ti text
| 标题,显示在左页脚 |
|
. St text
| 副标题,显示在右页脚 |
|
. Ts title
| 开始一个带标题的表格,表格会自动编号 |
|
. Te
| 结束一个表格(输出一个空行) |
|
. XX text
| 从文本创建索引条目,自动添加页码 |
|
. XN text
| 从文本创建索引交叉引用(无页码) |
2. 从打字机到文字处理器的转变
在探讨UNIX环境提供的文本处理工具之前,我们需要思考使用计算机进行写作时不可避免的底层变化。对于作家来说,计算机程序最重要的功能是能够记住输入的内容,并允许逐步修改,避免每次修改草稿都要从头重新输入。
写作本质上是一个迭代的过程,很少有作家能一气呵成完成一篇作品。大多数人会反复修改同一篇文章,添加或删除单词、短语和句子,改变思路顺序,甚至将一个句子扩展成几页的内容。使用纸质写作时,作家需要定期打印一份干净的副本进行阅读和进一步修改,直到新的草稿也变得杂乱无章。正如乔伊斯·卡罗尔·奥茨所说:“没有一本书是真正完成的,它只是被放弃了。”
文字处理最初在办公室中流行,帮助秘书们准备完美的信件、备忘录和报告。随着低成本个人计算机取代了专用文字处理器,作家们很快意识到了这个新工具的价值。在一个痴迷于书面文字的文明中,文字处理程序WordStar成为个人计算机革命早期的畅销书之一并非偶然。
当你学会使用文字处理器写作时,你的写作风格会发生变化。由于修改变得如此容易,在写作时边想边打比事先精心构思大纲并逐句润色更加可行。如果你使用大纲写作,可以先输入大纲,然后逐节填充内容。无论是撰写结构化文档(如技术手册)还是自由流畅的作品,都可以轻松地以小段的形式写作,并在整理思路时移动这些段落。
与使用打字机写作相比,使用文字处理器写作有很大的不同。打字机往往迫使你按照线性顺序写作,先写一段,然后再回头修改。而在文字处理器上,修改是持续进行的,你可以随时返回修改之前输入的内容,甚至可以移动段落以调整文章结构。
然而,使用文字处理器写作并不意味着作品可以一气呵成。实际上,使用文字处理器的作家往往会生成比使用笔或打字机的作家更多的草稿。阅读打印出来的副本仍然能提供一种独特的编辑距离,尤其是当副本格式精美、排版完美时。
文字处理程序的另一个主要好处是它们可以帮助作家进行简单的文档格式化。例如,文字处理器可以自动在每行末尾插入回车符,并调整单词之间的间距,使所有行的长度相同。更重要的是,当你进行修改时,文本会自动重新调整格式。此外,还有可能提供居中、下划线和加粗等命令。
文档的粗略格式化可以掩盖许多问题。当你阅读手写标记的打字机初稿时,很容易迷失文档的整体思路。而当你有一份干净的副本时,文档的组织和内容缺陷会在崭新的纸张上清晰地显现出来。
但是,每次修改后打印干净草稿的能力也给作家带来了额外的负担。以前你只需要关注内容,现在你可能会为页边距、标题、加粗、斜体等格式的一致性而烦恼,这些曾经无关紧要的细节现在已经成为你写作任务的一部分。
随着作家越来越深入地参与文档格式化,工具必须能够像修改内容一样轻松地修改文档的外观。考虑到从打字机到文字处理器的演变带来的这些变化,让我们来看看一个文字处理系统应该为作家提供哪些功能。
3. 文字处理的工作空间
文字处理器最重要的功能之一是提供一个可以创建文档的空间。从某种意义上说,终端上的视频显示屏类似于一张纸,它会回显你输入的字符。但文字处理器的工作空间并不像卷在打字机里的纸张那样明确,纸张在完成后可以整齐地添加到已完成的工作堆中,或者作为错误的开始被撕掉揉皱。从计算机的角度来看,你的工作空间是一个称为缓冲区的内存块,在你开始文字处理会话时分配。这个缓冲区是一个临时存储区域,用于保存你的工作,并在每次会话结束时清空。
为了保存你的工作,你需要将缓冲区的内容写入文件。文件是磁盘(硬盘或软盘)上的永久存储区域。在将工作保存到文件后,你可以在另一个会话中检索并使用它。
当你开始编辑一个已存在于文件中的文档时,会创建该文件的一个副本,并将其内容读入缓冲区。你实际上是在副本上进行工作和修改,而不是原始文件。直到你在工作会话期间或结束时保存更改,文件才会被更新。你还可以丢弃对缓冲区副本所做的更改,保持原始文件不变,或者将文档的多个版本保存到不同的文件中。
特别是在处理大型文档时,磁盘文件的管理可能会成为一项重大任务。如果你像大多数作家一样保存多个草稿,很容易忘记哪个版本是最新的。
一个理想的文本处理环境应该为严肃的作家提供在磁盘上保存和管理多个草稿的工具,而不仅仅是在纸上。它应该允许作家:
- 处理任何长度的文档;
- 保存文件的多个版本;
- 将缓冲区的部分内容保存到文件中以备后用;
- 轻松在多个文件之间切换;
- 将现有文件的内容插入缓冲区;
- 总结文档两个版本之间的差异。
大多数个人计算机上的文字处理程序似乎最适合处理短文档,如办公室每天大量生成的信件和备忘录。虽然也可以创建更长的文档,但这些程序缺少许多有助于组织大型文档(如书籍或手册)的功能。
然而,早在文字处理器流行之前,程序员就开始使用另一类称为文本编辑器的程序。文本编辑器主要用于输入计算机程序,而不是文本,并且是为计算机专业人员设计的,对于计算机新手来说可能更难学习,因为它们缺少大多数文字处理器提供的许多屏幕格式化功能。
尽管如此,程序开发环境中使用的文本编辑器在管理大型写作项目方面通常比办公室文字处理程序提供更好的功能。大型程序和大型文档一样,通常包含在许多单独的文件中,并且跟踪程序版本之间的差异至关重要。
UNIX是一个卓越的程序开发环境,因此也是一个出色的文档开发环境。尽管与复杂的办公室文字处理器相比,它的文本编辑工具起初可能看起来有限,但实际上它们要强大得多。
4. 编辑工具
对许多人来说,能够从文件中检索文档并轻松进行多次修改,使得他们再也无法回到打字机时代。然而,在享受文字处理的好处之前,你需要学习很多东西。
编辑操作是通过发出命令来执行的。每个文字处理系统都有自己独特的命令集。至少,有以下命令:
- 移动到文档中的特定位置;
- 插入新文本;
- 更改或替换文本;
- 删除文本;
- 复制或移动文本。
要对文档进行更改,你必须能够移动到文本中想要编辑的位置。大多数文档太大,无法在单个终端屏幕上完整显示,通常终端屏幕只能显示24行文本。因此,通常只显示文档的一部分,这个部分视图有时被称为窗口。当你输入新文本并到达窗口的底部行时,屏幕上的文本会自动滚动(向上滚动)以显示底部的额外一行。一个光标(下划线或方块)标记你在窗口中的当前位置。
基本上有两种移动方式:
- 将新文本滚动到窗口中;
- 在窗口内定位光标。
当你开始一个会话时,文本的第一行是窗口中的第一行,光标位于第一个字符上。滚动命令通过在文档中向前或向后移动来更改窗口中显示的行。光标定位命令允许你上下移动到单独的行,并沿着行移动到特定的字符。
在定位光标后,你必须发出命令来进行所需的编辑。你选择的命令指示将影响多少文本:一个字符、一个单词、一行或一个句子。
由于使用同一个键盘输入文本和命令,必须有某种方法来区分两者。一些文字处理程序假设你在输入文本,除非你另有指定;新输入的文本要么替换现有文本,要么将其推到一边以腾出空间。命令通过按下键盘上的特殊键或组合标准键和特殊键(如控制键(CTRL))来输入。
其他程序假设你在发出命令,你必须先输入命令才能输入任何文本。每种方法都有优缺点。从打字机过渡过来的人在文本模式下开始更直观,但对于有经验的作家来说可能会更慢,因为所有命令都必须通过特殊的键组合输入,这些组合通常很难操作,会减慢打字速度。
比命令输入方式更重要的是命令的范围和速度。例如,对于习惯使用打字机的人来说,能够删除一个单词并输入替换词已经是很大的进步,但能够发出一个命令来替换整个文档中该单词的所有出现则更好。而且,在开始进行这种全局更改后,如果犯了错误,必须有某种方法可以撤销这些更改。
一个文字处理器如果为了易于学习而减少命令数量,最终会让严肃的作家失望,因为学习复杂命令所花费的时间在简化复杂任务时很容易得到回报。而且,当你发出一个复杂命令时,它必须尽可能快速地执行,这样你就不会在计算机处理时等待。当你在键盘前花费数小时或数天时,额外的几秒钟会累积起来,一旦体验到摆脱繁琐工作的自由,作家们就会希望尽可能地享受更多的自由。
文本编辑器在文字处理器之前就已经开发出来(在计算机的快速发展过程中)。许多文本编辑器最初是为打印终端设计的,而不是文字处理器使用的基于CRT的终端。这些程序的命令通常是逐行处理文本的,而且往往比等效的办公室文字处理命令更晦涩难懂。
然而,尽管文本编辑器使用的命令有时更难学习,但它们通常非常有效。(为慢速纸质终端设计的命令通常非常强大,以弥补输入和输出设备的有限能力。)
有两种基本类型的文本编辑器:行编辑器和屏幕编辑器,在UNIX中都可以使用。区别很简单:行编辑器一次显示一行,而屏幕编辑器可以显示大约24行或整个屏幕。
UNIX中的行编辑器包括ed、sed和ex。虽然这些行编辑器对于作家的通用用途来说已经过时,但在某些应用中它们表现出色。
UNIX中最常见的屏幕编辑器是vi。学习vi或其他合适的编辑器是掌握UNIX文本处理环境的第一步。你大部分时间将花在使用编辑器上。
UNIX屏幕编辑器(如vi和emacs)缺少许多文字处理器常见的易于学习的功能,没有菜单,只有基本的在线帮助屏幕,命令通常复杂且不直观,但它们功能强大且速度快。更重要的是,UNIX行编辑器(如ex和sed)提供了文字处理器中没有的额外功能,即编写可以应用于多个文件的编辑命令脚本的能力。这种编辑脚本为作家开辟了新的功能范围。
5. 文档格式化
文本编辑固然很好,但写作过程的目标是生成供他人阅读的打印文档。而打印文档不仅仅是纸上的文字,它是文本在页面上的排列。例如,商务信函的各个元素以一致的格式排列,这有助于阅读信函的人识别这些元素。报告和更复杂的文档(如技术手册或书籍)需要更多的格式关注。文档的格式传达了信息的组织方式,有助于向读者呈现思想。
大多数文字处理程序都有内置的格式化功能。格式化命令与编辑命令混合在一起,这样你可以在屏幕上塑造你的文档。这些格式化命令是使用打字机时可用命令的简单扩展。例如,自动居中命令可以省去手动计算字符数以居中标题或其他文本的麻烦。可能还有自动分页和打印页眉或页脚等功能。
相比之下,文本编辑器通常只有很少的格式化功能。由于它们是为输入程序而设计的,其格式化功能往往面向一种或多种编程语言所需的格式。
然而,即使是程序员也需要撰写报告。特别是在AT&T(UNIX的开发地),非常重视文档准备工具,以帮助贝尔实验室的程序员和科学家撰写研究报告、手册和其他与开发工作相关的文档。
当时,强调易于使用和简单屏幕格式化的文字处理还处于起步阶段,而计算机照相排版已经是一门成熟的艺术。直到最近,在视频屏幕上仍然无法完全显示排版文档中使用的可变字体样式和大小。因此,照相排版长期以来一直使用一种标记系统,用特殊代码表示格式化指令。这些给计算机排版机的格式化指令通常是以前给人工排版员指令的直接延续,如居中下一行、缩进五个空格、加粗这个标题。
UNIX系统最常用的文本格式化程序是nroff。要使用它,你必须在文本中穿插格式化指令(通常是前面带句点的一两个字母代码),然后将文件通过格式化程序处理。nroff程序解释这些格式化代码,并在将文档传递给打印机时“即时”重新格式化。nroff格式化程序为行式打印机、点阵打印机和高质量打印机准备文档。另一个程序troff使用与nroff相同标记语言的扩展版本,但为激光打印机和排版机准备文档。
虽然使用标记语言进行格式化似乎比大多数办公室文字处理程序的“所见即所得”(wysiwyg)方法差很多,但实际上它有很多优点。
首先,除非你使用非常复杂的计算机和软件(即所谓的电子出版系统,而不仅仅是文字处理器),否则不可能在屏幕上完全显示文档在打印页面上的样子。例如,屏幕可能无法表示加粗或下划线,除非使用特殊的格式化代码。Wordstar是个人计算机文字处理程序的先驱之一,它通过用特殊控制字符^S(按住控制键并键入字母S生成的字符)包围要下划线的单词来表示下划线。例如,以下标题行在文档打印时会有下划线:
^Sword Processing with WordStar^S
这真的比以下nroff结构更好吗?
. ul
Text Processing with vi and nroff
挑选Wordstar这个较旧的文字处理程序可能不太公平,但很少有文字处理程序能完全实现“所见即所得”的错觉。通常屏幕上的格式会与控制代码混合。更重要的是,大多数文字处理器主要面向短文档的制作。当你处理的文档超出信件、备忘录或报告的范围时,你会开始意识到格式化不仅仅是表面上看到的那样。
虽然“所见即所得”对于排版单页文档很方便,但在大型文档中保持格式一致性要困难得多。大型文档的设计通常在写作开始之前就确定了,就像在建造房屋之前先绘制一套计划一样。设计是组织文档的计划,安排各个部分,使相同类型的材料以相同的方式处理。
文档的各个部分可能是章节、节或小节。例如,技术手册通常按章节和附录组织。在每个章节中,可能有编号的节,这些节又进一步分为三到四个级别的小节。
文档设计的目的是在整个文档中实现类似于书籍目录的功能。它展示了文档的结构,帮助读者定位信息。
每个部分都必须清晰标识。设计规定了它们的外观,试图在整个文档中实现一致性。例如,设计策略可能规定主要节标题全部大写、加下划线,上方有三个空行,下方有两个空行;次要标题使用大小写混合、加下划线,上方有两个空行,下方有一个空行。
如果你曾经尝试使用文字处理器格式化大型文档,你可能会发现很难在这些格式化细节上保持一致性。相比之下,标记语言(特别是像nroff这样允许你定义重复命令序列或宏的语言)使这变得容易:标题的样式只需定义一次,然后使用代码引用。例如,顶级标题可以用代码
. H1
指定,二级标题用
. H2
指定。
综上所述,从打字机到文字处理器的转变带来了写作方式和文档处理的重大变革。UNIX环境中的文本处理工具,无论是编辑工具还是格式化工具,都为作家和程序员提供了强大而灵活的解决方案。虽然学习曲线可能较陡,但掌握这些工具后,你将能够更高效地处理各种规模和复杂度的文档。
6. 标记语言格式化的优势
标记语言格式化在处理大型文档时展现出显著优势,下面通过具体对比和操作示例来详细说明。
6.1 格式一致性的实现
在使用文字处理器格式化大型文档时,保持格式一致性是一项极具挑战性的任务。例如,在一份技术手册中,要确保所有章节标题、小节标题的格式统一,如字体、字号、缩进、间距等,手动操作不仅繁琐,还容易出错。而标记语言通过定义宏来解决这一问题。
以nroff为例,假设我们要定义一个一级标题的格式,使其全部大写、加下划线,上方有三个空行,下方有两个空行,可以这样操作:
.define H1
.sp 3
.u
\*(H1
.u
.sp 2
.endef
在文档中使用一级标题时,只需输入
.H1 标题内容
,就可以自动应用我们定义好的格式。这样,无论文档有多少章节,标题格式都能保持一致。
6.2 全局修改的便捷性
当文档的格式需求发生变化时,标记语言的优势更加明显。例如,我们决定将所有一级标题的上方空行从三个改为四个,在标记语言中,只需要修改宏的定义:
.define H1
.sp 4
.u
\*(H1
.u
.sp 2
.endef
然后重新处理文档,所有一级标题的格式都会自动更新。而在文字处理器中,可能需要逐个标题进行修改,工作量巨大且容易遗漏。
6.3 文档结构的清晰呈现
标记语言通过标记代码清晰地展示了文档的结构。例如,在一个包含多个章节和小节的文档中,使用
.Se
开始一个章节,
.Ss
开始一个小节,读者可以通过查看标记代码快速了解文档的层次结构。以下是一个简单的示例:
.Se 第一章
这是第一章的内容。
.Ss 第一节
这是第一章第一节的内容。
.Se 第二章
这是第二章的内容。
这种结构在处理复杂文档时尤为重要,有助于作者组织内容,也方便读者理解文档的逻辑关系。
7. UNIX文本处理工具的综合应用
在实际的文本处理中,我们可以将UNIX的编辑工具和格式化工具结合使用,以实现高效的文档创作和处理。以下是一个具体的操作流程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(使用vi编辑文档):::process
B --> C{是否需要全局修改}:::decision
C -->|是| D(使用sed编写编辑脚本):::process
C -->|否| E(插入nroff格式化指令):::process
D --> E
E --> F(运行nroff进行格式化):::process
F --> G(输出格式化后的文档):::process
G --> H([结束]):::startend
7.1 使用vi编辑文档
vi是UNIX中常用的文本编辑器,它功能强大但学习曲线较陡。以下是一些基本的操作步骤:
1. 打开文件:在终端中输入
vi 文件名
,按回车键即可打开文件。
2. 进入编辑模式:按下
i
键进入插入模式,此时可以输入文本。
3. 保存文件:按下
Esc
键退出插入模式,输入
:w
保存文件。
4. 退出vi:输入
:q
退出,如果文件有修改且未保存,输入
:wq
保存并退出,输入
:q!
不保存强制退出。
7.2 使用sed进行全局修改
sed是一个强大的流编辑器,可以对文本进行全局替换、删除等操作。例如,我们要将文档中所有的“example”替换为“sample”,可以使用以下命令:
sed 's/example/sample/g' 文件名 > 新文件名
这个命令会将文件中所有的“example”替换为“sample”,并将结果输出到新文件中。
7.3 插入nroff格式化指令
在编辑好的文本中插入nroff格式化指令,如标题、段落、列表等。以下是一个包含格式化指令的文档示例:
.Se 文档标题
这是文档的正文内容。
.Ls N
.Li 列表项1
.Li 列表项2
.Le
7.4 运行nroff进行格式化
将包含格式化指令的文件通过nroff处理,生成格式化后的文档。在终端中输入以下命令:
nroff 文件名 > 输出文件名
这个命令会将文件进行格式化,并将结果输出到指定的文件中。
8. 总结与建议
通过以上对UNIX文本处理工具的介绍,我们可以看到它们在文档创作和处理方面具有强大的功能和灵活性。以下是一些总结和建议:
8.1 适用场景
- 对于小型文档,如信件、备忘录等,普通的文字处理程序可能已经足够满足需求,它们操作简单,易于上手。
- 对于大型文档,如书籍、技术手册等,UNIX的文本处理工具更具优势,能够更好地管理文档结构、保持格式一致性和进行版本控制。
8.2 学习建议
- 学习UNIX文本处理工具需要一定的时间和耐心,尤其是vi编辑器和标记语言的使用。建议从基础命令开始学习,逐步掌握复杂的操作。
- 多实践是提高技能的关键,可以通过编写一些简单的文档,尝试使用不同的编辑和格式化命令,加深对工具的理解和掌握。
8.3 工具搭配
- 可以将vi和nroff结合使用,利用vi的强大编辑功能和nroff的灵活格式化功能,提高文档处理的效率。
- 对于版本控制,可以使用UNIX中的版本控制系统,如CVS、SVN或Git,确保文档的各个版本得到妥善管理。
总之,UNIX文本处理工具为我们提供了一个高效、灵活的文档处理环境。虽然学习过程可能会遇到一些困难,但一旦掌握,将大大提升我们的文档创作和处理能力。希望大家通过不断学习和实践,能够熟练运用这些工具,创造出高质量的文档。
超级会员免费看
8

被折叠的 条评论
为什么被折叠?



